
    <html lang="zh-cn">
    <head>
    <meta content="text/html; charset=utf-8" http-equiv="content-type" />
    <link href="F:\v_awjliu\BKDocs\ZH/default.css" rel="stylesheet">
    </head>
    <body>
    <h1 id="_1">基础套餐安装指引</h1>
<blockquote>
<p>阅读前请确认好您的部署目的。</p>
<p>该文档适用于生产环境多机器分模块部署场景，如仅需体验该套餐功能，可参考 <a href="../单机部署/install_on_single_host.md">单机部署</a></p>
</blockquote>
<p>基础套餐包含：PaaS 平台、配置平台、作业平台、权限中心、用户管理、节点管理、标准运维、流程服务。</p>
<h2 id="_2">一、前期准备</h2>
<p>在开始安装前，请参照 <a href="../环境准备/get_ready.md">环境准备</a> 文档，配置系统环境。</p>
<h3 id="11">1.1 准备机器</h3>
<ol>
<li>建议操作系统： CentOS 7.6 及以上</li>
<li>建议机器配置</li>
<li>生产环境：建议 4 核 16 G，硬盘 100G 以上（可根据实际情况适当调整配置）<ul>
<li>机器数量：3 台（假设 ip 分别为：10.0.0.1，10.0.0.2，10.0.0.3）</li>
</ul>
</li>
<li>选择一台为中控机（假设为 10.0.0.1）进行安装部署操作，使用 root 账号登录。</li>
</ol>
<h3 id="12">1.2 获取证书</h3>
<ul>
<li>
<p>通过 <code>ifconfig</code> 或者 <code>ip addr</code> 命令分别获取 3 台机器第一个内网网卡 MAC 地址</p>
</li>
<li>
<p>前往蓝鲸官网证书生成页面（<a href="https://bk.tencent.com/download_ssl/">https://bk.tencent.com/download_ssl/</a>），根据提示在输入框中填入英文分号分隔的三个 MAC 地址，生成并下载证书</p>
</li>
<li>
<p>上传证书包至中控机 <code>/data</code></p>
</li>
<li>证书包包名：ssl_certificates.tar.gz</li>
</ul>
<h3 id="13">1.3 下载安装包</h3>
<ul>
<li>请前往 <a href="https://bk.tencent.com/download/">蓝鲸官网下载页</a> 下载基础套餐包</li>
</ul>
<h3 id="14">1.4 解压相关资源包</h3>
<ol>
<li>解压套餐包（包含蓝鲸相关产品，如 PaaS、CMDB、JOB 等；蓝鲸依赖的 rpm 包，SaaS 镜像，定制 Python 解释器；部署脚本）</li>
</ol>
<p><code>bash
   cd /data
   tar xf bkce_basic_suite-6.0.4.tgz</code></p>
<ol>
<li>解压各个产品软件包</li>
</ol>
<p><code>bash
   cd /data/src/; for f in *gz;do tar xf $f; done</code></p>
<ol>
<li>解压证书包</li>
</ol>
<p><code>bash
   install -d -m 755 /data/src/cert
   tar xf /data/ssl_certificates.tar.gz -C /data/src/cert/
   chmod 644 /data/src/cert/*</code></p>
<ol>
<li>拷贝 rpm 包文件夹到/opt/目录</li>
</ol>
<p><code>bash
   cp -a /data/src/yum /opt</code></p>
<h3 id="15-installconfig">1.5 生成并配置 install.config</h3>
<p><strong>说明：</strong></p>
<ul>
<li>gse 与 redis 需要部署在同一台机器上。</li>
<li>当含多个内网 IP 时，默认使用  /sbin/ifconfig 输出中的第一个内网 IP。</li>
<li>部署需要使用标准私有地址，若企业环境使用非标准私有地址，请参考 <a href="../环境准备/get_ready.md#非标准私有地址处理方法">环境准备-非标准私有地址处理方法</a></li>
</ul>
<pre class="codehilite"><code class="language-bash"># 请根据实际机器的 IP 进行替换第一列的示例 IP 地址，确保三个 IP 之间能互相通信
cat &lt;&lt; EOF &gt;/data/install/install.config
10.0.0.1 iam,ssm,usermgr,gse,license,redis,consul,mysql,lesscode
10.0.0.2 nginx,consul,mongodb,rabbitmq,appo
10.0.0.3 paas,cmdb,job,zk(config),appt,consul,nodeman(nodeman)

EOF</code></pre>


<h3 id="16">1.6 执行免密</h3>
<pre class="codehilite"><code class="language-bash">cd /data/install
bash /data/install/configure_ssh_without_pass</code></pre>


<h2 id="_3">二、开始部署</h2>
<h3 id="_4">初始化并检查环境</h3>
<pre class="codehilite"><code class="language-bash"># 初始化环境
./bk_install common

# 校验环境和部署的配置
./health_check/check_bk_controller.sh</code></pre>


<h3 id="paas">部署 PaaS 平台</h3>
<pre class="codehilite"><code class="language-bash"># 安装 PaaS 平台及其依赖服务
./bk_install paas</code></pre>


<p>PaaS 平台部署完成后，可以访问蓝鲸的 PaaS 平台。配置域名访问，请参考 <a href="./quick_install.md#三、访问蓝鲸">访问蓝鲸</a> 。</p>
<h3 id="app_mgr">部署 app_mgr</h3>
<pre class="codehilite"><code class="language-bash"># 部署 SaaS 运行环境，正式环境及测试环境
./bk_install app_mgr</code></pre>


<h3 id="_5">部署权限中心与用户管理</h3>
<pre class="codehilite"><code class="language-bash"># 权限中心
./bk_install saas-o bk_iam
# 用户管理
./bk_install saas-o bk_user_manage</code></pre>


<h3 id="cmdb">部署 CMDB</h3>
<pre class="codehilite"><code class="language-bash"># 安装配置平台及其依赖服务
./bk_install cmdb</code></pre>


<h3 id="job">部署 JOB</h3>
<pre class="codehilite"><code class="language-bash"># 安装作业平台后台模块及其依赖组件
./bk_install job</code></pre>


<h3 id="bknodeman">部署 bknodeman</h3>
<ul>
<li>
<p>如需使用跨云管控，请提前将节点管理的外网 IP 写入至节点管理后台服务所在机器的<code>/etc/blueking/env/local.env</code> 文件，详细请参考 <a href="../../维护手册/日常维护/open_proxy.md">开启 proxy</a>。否则请忽略该步骤</p>
</li>
<li>
<p>开始部署</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 安装节点管理后台模块、节点管理 SaaS 及其依赖组件
./bk_install bknodeman</code></pre>


<h3 id="_6">部署标准运维及流程管理</h3>
<p>依次执行下列命令部署相关 SaaS。</p>
<pre class="codehilite"><code class="language-bash"># 标准运维
./bk_install saas-o bk_sops

# 流程管理
./bk_install saas-o bk_itsm</code></pre>


<h3 id="_7">加载蓝鲸相关维护命令</h3>
<pre class="codehilite"><code class="language-bash">source ~/.bashrc</code></pre>


<h3 id="_8">初始化蓝鲸业务拓扑</h3>
<pre class="codehilite"><code class="language-bash">./bkcli initdata topo</code></pre>


<h3 id="lesscode">部署 lesscode (可选)</h3>
<pre class="codehilite"><code class="language-bash">./bk_install lesscode</code></pre>


<h3 id="_9">检测相关服务状态</h3>
<pre class="codehilite"><code class="language-bash">cd /data/install/
echo bkssm bkiam usermgr paas cmdb gse job consul | xargs -n 1 ./bkcli check</code></pre>


<h2 id="_10">三、访问蓝鲸</h2>
<h3 id="31-hosts">3.1 配置本地 hosts</h3>
<blockquote>
<p>下面介绍的操作均可能覆盖现有 hosts ，进行操作前请先确认是否需要备份。</p>
</blockquote>
<ol>
<li>Windows 配置</li>
</ol>
<p>用文本编辑器（如 <code>Notepad++</code>）打开文件：</p>
<pre class="codehilite"><code class="language-bash">C:\Windows\System32\drivers\etc\hosts</code></pre>


<p>将以下内容复制到上述文件内，并将以下 IP 需更换为本机浏览器可以访问的 IP，然后保存。如无部署 lesscode，可去掉 <code>lesscode.bktencent.com</code> 再进行绑定</p>
<pre class="codehilite"><code class="language-bash">10.0.0.2 paas.bktencent.com cmdb.bktencent.com job.bktencent.com jobapi.bktencent.com lesscode.bktencent.com
10.0.0.3 nodeman.bktencent.com</code></pre>


<p><strong>注意：</strong> 10.0.0.2 为 nginx 模块所在的机器，10.0.0.3 为 nodeman 模块所在的机器。IP 需更换为本机浏览器可以访问的 IP。</p>
<p>查询模块所分布在机器的方式：</p>
<pre class="codehilite"><code class="language-bash">grep -E &quot;nginx|nodeman&quot; /data/install/install.config</code></pre>


<blockquote>
<p>注意：如果遇到无法保存，请右键文件 hosts 并找到“属性” -&gt; “安全”，然后选择你登陆的用户名，最后点击编辑，勾选“写入”即可。</p>
</blockquote>
<ol>
<li>Linux / Mac OS 配置</li>
</ol>
<p>将以下内容复制到 <code>/etc/hosts</code> 中，并将以下 IP 需更换为本机浏览器可以访问的 IP，然后保存。</p>
<pre class="codehilite"><code class="language-bash">10.0.0.2 paas.bktencent.com cmdb.bktencent.com job.bktencent.com jobapi.bktencent.com lesscode.bktencent.com
10.0.0.3 nodeman.bktencent.com</code></pre>


<h3 id="32">3.2 获取管理员账户名密码</h3>
<p>在任意一台机器上，执行以下命令，获取管理员账号和密码。</p>
<pre class="codehilite"><code class="language-bash">grep -E &quot;BK_PAAS_ADMIN_USERNAME|BK_PAAS_ADMIN_PASSWORD&quot; /data/install/bin/04-final/usermgr.env</code></pre>


<h3 id="33">3.3 访问蓝鲸开始使用</h3>
<blockquote>
<p>默认蓝鲸工作台入口：http://paas.bktencent.com</p>
</blockquote>
<p>可参考蓝鲸 <a href="../../../../快速入门/quick-start-v6.0-info.md">快速入门</a> 以及相关 <a href="https://bk.tencent.com/docs/">产品白皮书</a></p>
<p>进阶选项：<a href="./value_added.md">监控日志套餐部署</a></p>
<p><a href="https://bk.tencent.com/s-mart/community/question/2120">【社区版 6.0.3 问题汇总 】</a></p><h1 id="_1">监控日志套餐安装指引</h1>
<blockquote>
<p>该套餐属于蓝鲸社区版增强套餐，请确认 <strong>基础套餐</strong> 是否已经部署完成；如未部署请参考 <a href="./detail_install.md">基础套餐部署</a>。</p>
</blockquote>
<p>该套餐主要适用于监控告警、日志采集分析以及故障自愈的场景。</p>
<p>主要包含蓝鲸相关产品：监控平台、日志平台、故障自愈。</p>
<h2 id="_2">前期准备</h2>
<blockquote>
<p>说明：因模块间存在依赖关系，需按照顺序依次部署： <code>监控平台 -&gt; 日志平台 -&gt; 故障自愈</code>。</p>
</blockquote>
<p>该套餐部署是通过标准运维流程实现，在部署前需要做如下准备：</p>
<h3 id="1">1.准备机器</h3>
<blockquote>
<p>为了保证环境的稳定，建议增强套餐独立于基础套餐的机器资源。</p>
</blockquote>
<ul>
<li>建议操作系统： CentOS 7.6 及以上</li>
<li>建议机器配置<ul>
<li>生产环境：建议 8 核 16 G，硬盘 100G 以上（可根据实际情况适当调整配置），机器数量：3 台</li>
<li>功能体验：建议 8 核 16 G，机器数量：1 台</li>
</ul>
</li>
</ul>
<h3 id="2">2.实现免密</h3>
<p>开始部署前，请确保新增主机跟中控机已实现免密。</p>
<pre class="codehilite"><code class="language-bash">ssh-copy-id &lt;ip&gt;</code></pre>


<h3 id="3-agent">3.请先前往节点管理，对新增主机进行 agent 安装</h3>
<ul>
<li>前往节点管理进行安装，根据图中步骤填写相关信息。</li>
</ul>
<p><img alt="valueinstall_agent" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/valueinstall_agent.png" /></p>
<ul>
<li>安装成功示意图，如果失败请解决报错后再进行重试或者重装。</li>
</ul>
<p><img alt="valueinstall_agent" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/install_agentsucc.png" /></p>
<h3 id="4">4.下载套餐安装包</h3>
<p>请前往 <a href="https://bk.tencent.com/download/">蓝鲸官网下载页</a> 下载监控日志套餐软件包并上传至中控机解压。</p>
<pre class="codehilite"><code class="language-bash">cd /data
tar xf bkce_co_package-6.0.4.tgz</code></pre>


<h3 id="5">5.将需要部署产品的标准运维流程模版导入至标准运维</h3>
<p>标准运维流程模版 <a href="https://bkopen-1252002024.file.myqcloud.com/ce/bk_sops_co_package-6.0.4.dat">下载</a></p>
<p><strong>详细步骤：</strong> <code>打开标准运维 -&gt; 项目流程 -&gt; 导入 -&gt; 点击上传 -&gt; 创建新流程</code></p>
<p><img alt="sops" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/sops.png" /></p>
<p>假设需要部署的 <code>监控日志套餐包</code> 已放置中控机的 <code>/data</code> 目录 ，<code>对应套餐包的标准运维流程模版</code> 已导入至标准运维。导入可参考如下:</p>
<p><img alt="sops" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/sops2.png" /></p>
<h3 id="6-installconfig">6.检查 install.config</h3>
<p>检查 install.config 文件是否已经包含增强套餐的相关模块分布，如果有请先移除相关模块。如无输出则可继续往下操作。</p>
<pre class="codehilite"><code class="language-bash">value_modules=(es7 monitorv3\(influxdb-proxy\) monitorv3\(monitor\) monitorv3\(grafana\) influxdb\(bkmonitorv3\) monitorv3\(transfer\) fta beanstalk log\(grafana\) log\(api\) kafka\(config\))

for module in ${value_modules[@]}; do if grep ${module} /data/install/install.config &gt;/dev/null; then echo -e &quot;The \e[1;31m ${module} \e[0m module exists in install.config, please remove it before deploying.&quot;; fi; done</code></pre>


<h3 id="7">7. 检查主机名</h3>
<p>检查新增机器的主机名是否与基础环境机器的主机名是否有冲突。如有冲突，请先进行修改，如无请忽略。</p>
<pre class="codehilite"><code class="language-bash">hostname</code></pre>


<h2 id="_3">开始部署</h2>
<h3 id="_4">监控平台</h3>
<p>选择 <code>[ce][deploy][bkmonitorv3]</code> 流程模版进行新建任务，根据提示填写相关信息。确认填写信息无误后，开始执行任务。</p>
<p>填写信息包括：</p>
<ul>
<li><code>ctrl_ip</code>：基础环境的中控机 IP</li>
<li><code>whole_pkg_path</code>：部署监控平台安装包的绝对路径</li>
<li><code>deply_iplist</code>：新增的机器 IP（如果基础环境的资源有富余，可以复用）</li>
</ul>
<p><img alt="bkmonitorv3_template" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/monitorv3_template.png" /></p>
<p>该部署流程主要相关操作：</p>
<ul>
<li>将监控平台安装包放至指定目录</li>
<li>生成监控平台 install.config 配置</li>
<li>初始化新增节点机器</li>
<li>授权监控平台所需的 MySQL 访问权限</li>
<li>安装监控相关依赖、监控平台后台、监控平台 SaaS</li>
</ul>
<blockquote>
<p>详细安装过程介绍，请查看<a href="../../基础包安装/安装详解/install_bkmonitorv3.md">安装监控平台详解</a>。</p>
</blockquote>
<h3 id="_5">日志平台</h3>
<p>选择 <code>[ce][deploy][bklog]</code> 流程模版进行新建任务，根据提示填写相关信息。确认填写信息无误后，开始执行任务。</p>
<p>填写信息包括：</p>
<ul>
<li><code>ctrl_ip</code>：基础环境的中控机 IP</li>
<li><code>whole_pkg_path</code>：部署日志平台安装包的绝对路径 </li>
<li><code>deply_iplist</code>：新增的机器 IP（如果基础环境的资源有富余，可以复用）</li>
</ul>
<p><img alt="bklog_template" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/bklog_template.png" /></p>
<p>该部署流程主要相关操作：</p>
<ul>
<li>将日志平台安装包放至指定目录</li>
<li>生成日志平台 install.config 配置</li>
<li>初始化新增节点机器</li>
<li>授权日志平台所需的 MySQL 访问权限</li>
<li>安装日志平台相关依赖、日志平台后台、日志平台 SaaS</li>
</ul>
<blockquote>
<p>详细安装过程介绍，请查看 <a href="../../基础包安装/安装详解/install_bkmonitorv3.md">安装日志平台详解</a>。</p>
</blockquote>
<h3 id="_6">故障自愈</h3>
<p>选择 <code>[ce][deploy][fta]</code> 流程模版进行新建任务，根据提示填写相关信息。确认填写信息无误后，开始执行任务。</p>
<p>该部署流程主要相关操作：</p>
<ul>
<li><code>ctrl_ip</code>：基础环境的中控机 IP</li>
<li><code>whole_pkg_path</code>：部署故障自愈安装包的绝对路径</li>
<li><code>deply_iplist</code>：新增的机器 IP（如果基础环境的资源有富余，可以复用）</li>
</ul>
<p><img alt="fta_template" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/fta_template.png" /></p>
<p>主要会做相关操作：</p>
<ul>
<li>将故障自愈安装包放至指定目录</li>
<li>生成故障自愈 install.config 配置</li>
<li>初始化新增节点机器</li>
<li>授权故障自愈所需的 MySQL 访问权限</li>
<li>安装故障自愈相关依赖、故障自愈后台、故障自愈 SaaS</li>
</ul>
<p>部署完成后，可参考蓝鲸 <a href="../../../../快速入门/quick-start-v6.0-monitor.md">快速入门：监控日志套餐</a> 以及相关 <a href="https://bk.tencent.com/docs/">产品白皮书</a></p><h1 id="_1">容器管理套餐安装指引</h1>
<h2 id="_2">安装概览</h2>
<p>【准备阶段】</p>
<ul>
<li><a href="./BCS-start.md#一、安装环境准备">准备蓝鲸基础环境</a></li>
<li><a href="./BCS-start.md#12">服务器资源准备</a></li>
</ul>
<p>【安装阶段】</p>
<ul>
<li><a href="./BCS-start.md#14">安装 GSE Agent</a></li>
<li><a href="./BCS-start.md#15">下载安装包和标准运维模板文件</a></li>
<li><a href="./BCS-start.md#16">解压安装包</a></li>
<li><a href="./BCS-start.md#21">导入标准运维模板</a></li>
</ul>
<p>【使用阶段】</p>
<ul>
<li><a href="./BCS-start.md#23">执行部署作业</a></li>
<li><a href="./BCS-start.md#三、访问容器管理平台">访问容器管理平台</a></li>
</ul>
<h2 id="_3">一、安装环境准备</h2>
<h3 id="11">1.1 基础环境依赖</h3>
<blockquote>
<p>若未部署蓝鲸基础环境，请参照<a href="../../基础包安装/多机部署/quick_install.md">社区版 6.0 基础套餐安装</a></p>
</blockquote>
<p>部署容器管理平台（以下简称：BCS）须依赖社区版 6.0 基础环境，基础环境内必须包含 4 个基础平台和 4 个基础 SaaS：</p>
<table><tbody>
<tr><th align='center'>基础平台</th><th align='center'>基础 SaaS</th></tr>
<tr><td align='center'>管控平台</td><td align='center'>用户管理</td></tr>
<tr><td align='center'>配置平台</td><td align='center'>权限中心</td></tr>
<tr><td align='center'>作业平台</td><td align='center'>节点管理</td></tr>
<tr><td align='center'>PaaS 平台</td><td align='center'>标准运维</td></tr>
</tbody></table>

<h3 id="12">1.2 服务器资源准备</h3>
<p><a id="12"></a></p>
<ol>
<li>建议操作系统： CentOS 7.6 及以上</li>
<li>容器管理平台服务器配置与所需数量：4 核 8G 两台、4 核 4G 一台</li>
<li>机器分布详解（请记录此处的机器编号，后续部署时需要填入）：</li>
</ol>
<table><tbody>
<tr><th width="10%" align='center'>机器</th><th align='center'>安装服务</th><th align='center'>配置</th></tr>
<tr><td width="10%" align='center'>机器 1</td><td align='center'>MYSQL 数据库、MongoDB 数据库、Redis 数据库、Harbor 私有仓库（客户端浏览器可访问的 IP）</td><td>最低使用 4 核 CPU、8G 内存、200G 磁盘（1 台）</td></tr>
<tr><td width="10%" align='center'>机器 2</td><td align='center'>BCS 后台服务、BCS 导航页（客户端浏览器可访问的 IP）、web_console 服务</td><td>最低使用 4 核 CPU、8G 内存、100G 磁盘（1 台）</td></tr>
<tr><td width="10%" align='center'>机器 3</td><td align='center'>容器监控服务</td><td>最低使用 4 核 CPU、4G 内存、100G 磁盘（1 台）</td></tr>
</tbody></table>

<blockquote>
<p>注意：
1. 服务器网络要与安装蓝鲸社区版基础包的服务器相通，在配置平台中需放在“蓝鲸”业务下
2. 容器管理平台服务器不能与 K8S 集群服务器、蓝鲸基础服务服务器共用，需要独立申请，否则会导致端口冲突等环境问题
3. K8S 集群服务器不能与容器管理平台服务器、蓝鲸基础服务服务器共用，需要独立申请，否则会导致端口冲突等环境问题
4. Harbor 私有仓库 IP 地址、BCS 导航页组件 IP 地址与 BCS 监控 IP 地址都会占用 TCP 80 端口，需要部署在 3 台不同的服务器上以免端口冲突</p>
</blockquote>
<h3 id="13">1.3 添加域名解析</h3>
<pre class="codehilite"><code class="language-bash"># Linux、Mac：/etc/hosts，Windows：C:\Windows\System32\drivers\etc\hosts
# BCS导航页组件IP地址（客户端浏览器可访问的地址） BCS导航页域名（BCS导航页域名前缀.蓝鲸基础域名） BCS导航页API域名（api-BCS导航页域名前缀.蓝鲸基础域名）

机器2的IP bcs.bktencent.com api-bcs.bktencent.com</code></pre>


<h3 id="14-bcs-gse-agent">1.4 安装 BCS 部署机器的 GSE Agent</h3>
<p><a id="14"></a></p>
<ul>
<li>安装方法，请参考<a href="../../../../节点管理/产品白皮书/QuickStart/DefaultAreaInstallAgent.md">【节点管理】Agent 安装</a></li>
<li>安装时业务请选择“蓝鲸”</li>
</ul>
<h3 id="15-bcs">1.5 下载 BCS 安装包</h3>
<p><a id="15"></a></p>
<ul>
<li>下载安装包，<a href="https://bkopen-1252002024.file.myqcloud.com/bcs/bcs_ce-6.0.10.tgz">下载地址</a></li>
<li>上传安装包至中控机 /data</li>
<li>容器管理平台扩展软件包：bcs_ce-6.0.10.tgz</li>
</ul>
<h3 id="16-bcs">1.6 解压 BCS 安装包</h3>
<p><a id="16"></a></p>
<pre class="codehilite"><code class="language-bash">tar xvf bcs_ce-6.0.10.tgz -C /data/</code></pre>


<h2 id="_4">二、开始部署</h2>
<h3 id="21">2.1 下载标准运维模版文件</h3>
<p><a id="21"></a></p>
<ul>
<li><a href="https://bkopen-1252002024.file.myqcloud.com/bcs/bk_sops_common_ce_2021_04_27-01.dat">下载模版文件</a>至本地</li>
<li>标准运维模版文件名：bk_sops_common_ce_2021_04_27-01.dat</li>
</ul>
<h3 id="22">2.2 导入标准运维模版</h3>
<p>打开标准运维---&gt;公共流程---&gt;导入---&gt;点击上传---&gt;选择标准运维模版文件名---&gt;流程 ID 不变提交</p>
<blockquote>
<p>注：因为 bcs-ops 模块需要关联标准运维模版流程 ID，如果流程 ID 有冲突请参考<a href="../../增强包维护/BCS/FAQ.md">BCS 维护手册-FAQ</a>的第 2 小点解决</p>
</blockquote>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/import_start.png" />
<img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/upload_dat_file.png" />
<img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/flow_id_commit.png" />
<img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/import_done.png" /></p>
<h3 id="23">2.3 新建任务</h3>
<p><a id="23"></a></p>
<p>打开标准运维---&gt;公共流程---&gt;[BlueKing][BCS][Basic] Environment Deployment---&gt;新建任务</p>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/create_task.png" /></p>
<h3 id="24">2.4 选择“蓝鲸”业务</h3>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/select_biz.png" /></p>
<h3 id="25">2.5 节点选择，不用修改，直接进入下一步</h3>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/step_select.png" /></p>
<h3 id="26">2.6 参数填写</h3>
<p>具体参数填写参考可点击这里 <a href="./BCS-V2.md#部署详细步骤">查看增强包部署详解-部署详细步骤-第 6 点</a></p>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/args_input.png" /></p>
<h3 id="27">2.7 执行部署作业</h3>
<p>执行作业过程中没有出现错误即部署正常，否则需要根据 job 执行错误信息解决问题。</p>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/exec_task.png" /></p>
<h2 id="_5">三、访问容器管理平台</h2>
<p>刷新蓝鲸工作台，会出现一个容器管理平台的 SaaS，点击图标会跳转到蓝鲸容器管理平台的 console 页面，也可以直接访问 URL <a href="http://bcs.bktencent.com">http://bcs.bktencent.com</a> 来访问容器管理平台。</p>
<p>如果无法访问时，可能是 hosts 域名解析没有生效，可以关闭浏览器后重试。</p>
<p>完成以上步骤容器管理平台就已经部署完毕。</p>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/bcs_home.png" /></p>
<h2 id="_6">四、部署验收</h2>
<h3 id="41-bcs">4.1 BCS 后台部署验收</h3>
<p>标准运维作业可以正常执行完成，执行过程无错误出现</p>
<h3 id="42-bcs-k8s">4.2 BCS K8S 集群部署验收</h3>
<ol>
<li>可以正常 新建项目</li>
<li>容器服务 BCS-K8S</li>
<li>创建容器集群正常</li>
<li>添加节点正常</li>
<li>创建/同步/删除命名空间</li>
<li>变量管理/删除/添加变量</li>
<li>Helm/Chart 仓库存在 rumpetroll、blueking-nginx-ingress Chart</li>
<li>监控 Dashboard-BCS Node、BCS Cluster、BCS Pod 存在数据</li>
<li>存在告警策略（告警中、正常、停用其中一个不为 0）</li>
<li>指标查询随意查询一个指标有数据</li>
<li>告警历史/通知组/操作审计可以正常打开</li>
<li>删除节点正常</li>
<li>删除容器集群正常</li>
</ol><h1 id="_1">持续集成套餐安装指引</h1>
<h2 id="_2">概述</h2>
<p>本文档适用于在蓝鲸社区版基础套餐中加装蓝鲸持续集成套餐。</p>
<p>蓝鲸持续集成套餐分为 流水线（CI，也称为“蓝盾”）、代码检查（CodeCC）等 2 个系统。</p>
<h2 id="ci">流水线（CI）</h2>
<h3 id="_3">资源准备</h3>
<p>请按照如下清单准备服务器或虚拟机（暂不支持容器），用于正式部署持续集成套餐。</p>
<p>机器数量： 2 （一台用作服务端，一台用作公共构建机（ ci(dockerhost) ））<br>
要求操作系统： CentOS 7.X （请勿使用其他系统）<br>
建议硬件配置：8 核 32GB （测试环境可使用 16GB 内存，性能略低）<br>
磁盘大小：100GB</p>
<h3 id="_4">准备工作</h3>
<h4 id="_5">蓝鲸组件依赖</h4>
<p>请先安装蓝鲸社区版 6.0 基础环境。并安装 “权限中心”，“节点管理”，“标准运维”等 SaaS （安装完成可在蓝鲸工作台“应用列表”中看到）。</p>
<p>如果您没有部署监控日志套餐，则默认不会安装 <code>es7</code>，需在中控机检查 es7 并安装：</p>
<pre class="codehilite"><code class="language-bash">cd &quot;${CTRL_DIR:-/data/install}&quot;
./bkcli status es7   # 检查es7是否安装并启动。应该显示为active。
./bkcli install es7  # 安装 es7
./bkcli start es7    # 启动 es7</code></pre>


<h4 id="_6">描述部署拓扑</h4>
<blockquote>
<p><strong>提醒</strong></p>
<p>从 <code>v1.2.x</code> 系列版本升级的用户，请更新 <code>install.config</code> 文件。</p>
</blockquote>
<p>编辑 install.config，指示 ci 的安装拓扑。参考示例：（请修改 IP1 等为合适的 IP）</p>
<pre class="codehilite"><code class="language-bash"># 服务端(网关+微服务), 单节点要求最低配置8核16G. 后期可升级节点硬件配置或分散微服务到不同节点.
IP1 ci(gateway)
IP1 ci(artifactory),ci(auth),ci(dispatch),ci(dispatch-docker),ci(environment)
IP1 ci(image),ci(log),ci(misc),ci(notify)
IP1 ci(openapi),ci(plugin),ci(process),ci(project),ci(quality)
IP1 ci(repository),ci(store),ci(ticket),ci(websocket)
# 可选的无编译环境. 资源开销较dockerhost低, 可以和服务端混合部署. 如无则无法使用&quot;无编译环境&quot;.
IP1 ci(agentless)
# 可选的公共构建机. 至少1台, 按需新增. 建议16核32G内存500GB磁盘.
IP2 ci(dockerhost)
# 私有构建机无需配置install.config, 默认仅支持Linux系统, 其他系统需参考官网文档完成实施.</code></pre>


<p>如需修改配置，请编辑中控机的 <code>$CTRL_DIR/bin/03-userdef/ci.env</code> 文件。然后重新执行流程。</p>
<h4 id="ssh">配置 ssh 免密</h4>
<p>在中控机使用 <code>./configure_ssh_without_pass</code> 脚本配置 ssh 免密登录。</p>
<h4 id="gse-agent">安装 gse agent</h4>
<p>登录蓝鲸 PaaS，打开“节点管理”。点击“agent 管理”界面下的“安装 Agent”按钮，安装“CI 主机”到 《<code>蓝鲸</code>》 业务下。如中控机未安装，需一并安装。</p>
<p>节点管理会自动注册 CMDB。安装成功后，在 CMDB 首页搜索“中控机”及“新增的 CI 主机”的 IP，搜索结果中对应 IP 的“业务拓扑”应当以“蓝鲸”开头。</p>
<h4 id="yum">yum 源</h4>
<p>部署过程中会自动安装 <code>jq</code>，此软件来自 EPEL 仓库。请确保 CI 主机已经配置了 EPEL 仓库。</p>
<h4 id="_7">离线环境部署（可选）</h4>
<p>部署流程中，会自动在中控机联网下载资源，如果中控机网络受限，可自行下载后传输到预期路径。 </p>
<p>资源列表如下：
1. CI 安装包（以 <code>v1.5.7</code> 为例，其他版本请自行替换版本号）：
  * 预期放置路径： <code>/data/src/bkci-v1.5.7-slim.tar.gz</code>
  * 参考下载地址（蓝鲸官网）： https://bkopen-1252002024.file.myqcloud.com/bkci/bkci-v1.5.7-slim.tar.gz
  * 参考下载地址（GitHub）： https://github.com/Tencent/bk-ci/releases/download/v1.5.7/bkci-slim.tar.gz （注意修改为预期放置路径的文件名）
2. rabbitmq_delayed_message_exchange 插件 （版本固定，不能修改）：
 * 预期放置路径: <code>/data/src/rabbitmq_delayed_message_exchange-3.8.0.ez</code>
 * 参考下载地址： https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.8.0/rabbitmq_delayed_message_exchange-3.8.0.ez</p>
<h3 id="_8">快速部署</h3>
<ol>
<li>导入标准运维流程模板</li>
</ol>
<p>进入“标准运维”，选择《<code>蓝鲸</code>》业务，导入 <a href="https://bkopen-1252002024.file.myqcloud.com/bkci/bk-ci-deploy-20210706.dat">部署流程模板</a> 。</p>
<ol>
<li>执行部署</li>
</ol>
<p>从模板 “[蓝鲸持续集成][CI]部署或升级流水线” 新建任务。</p>
<blockquote>
<p>直接点击下一步。（初次部署勾选全部步骤，后续按需取消。）</p>
<p>填写蓝鲸中控机 IP 及版本号。版本号建议填写蓝鲸增值套餐下载界面的推荐版本号。也可参考 <a href="https://github.com/Tencent/bk-ci/releases">GitHub Release 页面</a> ，选择注明适配蓝鲸社区版 6.0 的版本。</p>
<p>流程中会自动下载重命名安装包，也可手动下载安装包，并传输到中控机上，确保文件路径为 /data/src/bkci-版本号.tar.gz，可自动跳过下载步骤。</p>
<p>如果出现异常，请查看具体步骤的报错，故障排除后可直接重试对应的步骤。</p>
</blockquote>
<h3 id="_9">访问蓝盾</h3>
<p>请配置 DNS 系统或本地 hosts 文件。将 <code>BK_CI_FQDN</code> 解析到 <code>ci（gateway）</code> 所在的 IP。</p>
<p>我们在部署结果中提示了访问链接及参考的 hosts 内容。请查看部署流程中 “集群初始配置” 步骤中的“job 任务链接”，在 console 输出的末尾显示访问的域名及 IP。</p>
<p>完成域名解析后，即可在蓝鲸工作台打开“蓝盾”。</p>
<p><img alt="CI_home.png" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/CI_home.png" /></p>
<p>相关链接：
* <a href="../../../../持续集成平台/产品白皮书/Quickstarts/Create-your-first-pipeline.md">快速入门</a>
* <a href="../../../../持续集成平台/产品白皮书/产品简介/README.md">产品白皮书</a>
* <a href="https://docs.bkci.net/">BKCI Docs</a>
* <a href="../../增强包维护/蓝盾/FAQ.md">常见问题</a>
* <a href="./CI-V2.md">部署详解</a>
* <a href="../../增强包维护/蓝盾/Maintenance.md">日常维护</a>
* <a href="../../增强包维护/蓝盾/Private-build-setup.md">私有构建机方案</a></p>
<h2 id="codecc">代码检查（CodeCC） （即将推出，敬请期待）</h2><h1 id="51-603">社区版 5.1 - 6.0.3 升级指引</h1>
<h2 id="_1">适用范围</h2>
<ul>
<li>社区版 5.1 - 6.0.3</li>
</ul>
<h2 id="_2">准备机器</h2>
<h3 id="_3">套餐拆分说明</h3>
<ol>
<li>从社区版 6.0.3 开始，原社区版完整包已拆分为基础套餐与监控日志套餐：</li>
<li><strong>基础套餐</strong>：PaaS 平台、配置平台、作业平台、权限中心、用户管理、节点管理、标准运维、流程服务。</li>
<li><strong>监控日志套餐</strong>：监控平台、日志平台、故障自愈。</li>
<li>为了保证环境的稳定，建议各个套餐使用单独的机器资源部署</li>
</ol>
<h3 id="_4">配置评估</h3>
<ol>
<li>社区版 5.1 的最低机器配置要求为：1 台 4 核 16G + 2 台 4 核 8G</li>
<li>社区版 6.0 基础套餐的最低机器配置要求为：3 台 4 核 16G</li>
<li>社区版 6.0 监控日志套餐的最低机器配置要求为：1 台 8 核 16G</li>
</ol>
<h3 id="_5">机器准备建议</h3>
<ol>
<li>现有环境机器配置满足：3 台 4 核 16G，则需要增加 1 台 8 核 16G 部署监控日志套餐，升级请参考 <a href="./update_install_config_for_v6.md#新增主机进行升级">新增主机进行升级</a></li>
<li>现有环境机器配置满足：3 台 8 核 32G，可不增加机器直接升级（不建议），升级请参考 <a href="./update_install_config_for_v6.md#原机器配置进行升级">原机器配置进行升级</a></li>
</ol>
<h2 id="_6">风险提示</h2>
<ul>
<li>请仔细阅读本升级文档，避免因未注意相关细节造成误操作。</li>
<li>如无特殊说明，所述操作均在中控机执行。</li>
<li>原蓝鲸官方 SaaS 必须提前下架，否则将影响 SaaS 升级部署。</li>
<li>请严格按照本文档步骤进行升级，如升级过程存在问题，请先解决该问题后再继续往下执行升级。</li>
<li>非标准私有 IP 用户需在解压新的脚本后，需要按照以前修改 <a href="https://bk.tencent.com/docs/document/6.0/127/7543">非标准私有 IP</a> 的方式重新修改。</li>
<li>如果 MySQL 备份参考本升级文档的备份方式，涉及到有自行开发的 SaaS 应用，请重新前往 MySQL 重新授权。</li>
<li>本次升级务必保证 MySQL/MongoDB 机器磁盘空间充足，避免磁盘空间不足导致备份失败。</li>
<li>本升级方案不负责迁移 5.1 中的监控数据，包括开源组件中 influxdb 和 es 的数据，监控数据将会丢失，请知悉。</li>
<li>本次升级方案为停服更新，包含多个开源组件版本、官方组件版本的升级，升级时间较长，请避开业务繁忙时期进行升级。</li>
<li>本次升级相关产品有新增进程等，请在升级前先对原主机资源(内存、CPU 等)进行评估是否足够，可参考官网给出的 <a href="https://bk.tencent.com/download/">机器配置</a> 进行评估。</li>
<li>本升级方案仅适用于未做过任何改造的用户，若有定制化调整（如接入企业登陆，新增 API 以及接入其他企业内部系统），或部分产品为开源产品不适用本升级指引，需自行维护特殊化部分功能。</li>
</ul>
<h2 id="_7">重点提前知</h2>
<p><strong>升级完之后：</strong></p>
<ul>
<li>请前往节点管理升级 agent、proxy 以及各插件至最新版本。</li>
<li>因社区版 6.0 相关接口变化，升级完成后会导致服务商的 SaaS 不可用，请知悉。</li>
</ul>
<h2 id="_8">升级前置准备</h2>
<p>下述所有升级步骤均以默认的安装目录 <code>/data/bkce</code> 为例，如使用自定义安装目录请在相关操作前进行替换。</p>
<p>1.下载软件包以及迁移工具，并将其放置 /data 目录</p>
<table>
<thead>
<tr>
<th>软件包</th>
<th>下载地址</th>
<th>MD5</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>bkce_src_6.0.3.tar.gz</td>
<td><a href="https://bkopen-1252002024.file.myqcloud.com/ce/bkce_src-6.0.3.tgz">https://bkopen-1252002024.file.myqcloud.com/ce/bkce_src-6.0.3.tgz</a></td>
<td>565d48217a1ff1002fe181130637b170</td>
<td>蓝鲸完整包</td>
</tr>
<tr>
<td>迁移工具合集</td>
<td><a href="https://bkopen-1252002024.file.myqcloud.com/ce/ce6.0_upgrade_tools.zip">https://bkopen-1252002024.file.myqcloud.com/ce/ce6.0_upgrade_tools.zip</a></td>
<td>5a7632530948e0733368f859c4db609d</td>
<td>包含下表所有迁移工具</td>
</tr>
<tr>
<td>upgrade.py</td>
<td>-</td>
<td>4683f0f7d5136c1799b5010f8960d7e3</td>
<td>节点管理升级脚本</td>
</tr>
<tr>
<td>migrate_old_environ_v2.sh</td>
<td>-</td>
<td>4ae6c6f2a1ccb4658c7a124857561d67</td>
<td>旧变量转换脚本</td>
</tr>
<tr>
<td>iam_v3_legacy_1.0.16_for_ce.tgz</td>
<td>-</td>
<td>106f8a90f243be85743ff7baf1d0eafc</td>
<td>权限中心迁移脚本</td>
</tr>
<tr>
<td>job-migration-ce_0.1.2_Linux_x86_64.tar.gz</td>
<td>-</td>
<td>3949713d37668535915bf03a4dd09a6e</td>
<td>JOB 升级脚本</td>
</tr>
<tr>
<td>job-account-perm-migration_v0.0.0-next_Linux_x86_64.tar.gz</td>
<td>-</td>
<td>5eebb26767debc18d2620ec0840573bf</td>
<td>JOB 帐户迁移</td>
</tr>
</tbody>
</table>
<p>2.升级前，请检查环境各主机资源情况，避免升级过程中出现内存或者磁盘不足等情况。配置请参考 <a href="https://bk.tencent.com/download/">蓝鲸官网下载页</a> 。</p>
<p>3.当数据库的数据量过大时，可以考虑使用 truncate 或 delete 的方式，清空监控告警表的数据 <strong>（该项由用户自主决定是否清理该表的数据）</strong>。</p>
<ul>
<li>库名：bkdata_monitor_alert</li>
<li>表名：ja_alarm_alarminstance</li>
</ul>
<h3 id="saas">下架官方 SaaS</h3>
<p>请访问蓝鲸 PaaS 平台，通过【开发者中心】-&gt;【 S-mart 应用】下架所有官方 SaaS。</p>
<h3 id="_9">解压迁移工具包</h3>
<pre class="codehilite"><code class="language-bash">unzip ce6.0_upgrade_tools.zip -d /data/</code></pre>


<h3 id="_10">迁移配置文件相关变量</h3>
<p>将社区版 5.1 的环境变量转换成社区版 6.0 的环境变量。请保存好生成的文件。
该脚本会在中控机生成 <code>${HOME}/.tag/dbadmin.env</code> 标记文件，请在正式升级时确认该文件是否存在。</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

cd /data
bash migrate_old_environ_v2.sh</code></pre>


<h3 id="_11">蓝鲸用户检查</h3>
<p>社区版 6.0 中蓝鲸组件统一由 <code>blueking</code> 用户管控，需要在所有蓝鲸后台服务器中创建 id 为 10000 的 blueking 用户。
如已存在 id 为 10000 的用户，请自行处理。</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
for ip in ${ALL_IP[@]}; do
    ssh ${ip} &quot;if id 10000 &gt; /dev/null; then echo &quot;${ip} 已存在 id 为 10000 的用户&quot;;fi&quot;
done</code></pre>


<h3 id="_12">停止相关服务进程</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
# 停止蓝鲸相关服务
echo fta bkdata appo appt gse job cmdb paas redis nginx license kafka es beanstalk influxdb zk rabbitmq consul | xargs -n1 ./bkcec stop

# 观察进程是否已经停止，如果没有停止，可手动强制停止
echo fta bkdata appo appt gse job cmdb paas redis nginx license kafka es beanstalk influxdb zk rabbitmq consul | xargs -n1 ./bkcec status</code></pre>


<h2 id="_13">数据备份</h2>
<h3 id="mysql">备份 MySQL</h3>
<p><strong>备份前，请确认使用到 MySQL 的相关服务已停止，避免出现数据不一致的问题。</strong>
该备份方式仅供参考，可自行选择备份方式。</p>
<ul>
<li>登陆至 MySQL 机器，创建备份目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
ssh $MYSQL_IP

# 创建备份目录
source /data/install/utils.fc
mkdir -p /data/dbbak
cd /data/dbbak</code></pre>


<ul>
<li>生成备份脚本</li>
</ul>
<p><strong>注意:</strong> 该备份方式不包含 MySQL 默认库的备份，所以涉及自行开发的 SaaS 应用使用到的帐户密码会丢失。如无，可参考如下方式进行备份。</p>
<pre class="codehilite"><code class="language-bash"># joblog 在升级的过程中可以不需要备份，可以加入到 ignoredblist 列表里。但是为了后续回滚，请确保 joblog 已存在有一份备份数据。

cat &gt;dbbackup_mysql.sh &lt;&lt;EOF
#!/bin/bash

ignoredblist='information_schema|mysql|test|db_infobase|performance_schema|sys'

dblist=&quot;\$(mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_IP -P$MYSQL_PORT -Nse &quot;show databases;&quot;|grep -Ewv &quot;\$ignoredblist&quot;|xargs echo)&quot;

mysqldump -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_IP -P$MYSQL_PORT  --skip-opt --create-options --default-character-set=utf8mb4 -R  -E -q -e --single-transaction --no-autocommit --master-data=2 --max-allowed-packet=1G  --hex-blob  -B  \$dblist &gt; /data/dbbak/bk_mysql_alldata.sql

EOF</code></pre>


<ul>
<li>开始备份</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 如果不存在 mysql 命令可以手动安装（非必选）
yum -y install mysql

# 执行备份操作
bash dbbackup_mysql.sh

# 请检查导出是否正确
grep 'CREATE DATABASE' bk_mysql_alldata.sql</code></pre>


<ul>
<li>停止服务</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机操作
./bkcec stop mysql
./bkcec status mysql

# 查看是否存在残余进程
rcmd &quot;root@$MYSQL_IP&quot; &quot;ps -ef | grep mysql&quot;</code></pre>


<h3 id="mongodb">备份 MongoDB</h3>
<p>该备份方式仅供参考，可自行选择备份方式。</p>
<ul>
<li>登陆至 MongoDB 机器，创建备份目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
ssh $MONGODB_IP

# 创建备份目录
mkdir -p /data/mongodb_bak</code></pre>


<ul>
<li>开始备份 MongoDB</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
# 备份 MongoDB 数据：
mongodump --host $MONGODB_IP -u $MONGODB_USER -p $MONGODB_PASS --oplog --gzip --out /data/mongodb_bak</code></pre>


<ul>
<li>停止 MongoDB</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcec stop mongodb</code></pre>


<ul>
<li>备份 MongoDB 数据目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

for ip in ${MONGODB_IP[@]}; do
    backup_dir=/data/mongodb_dirbak_$(date +%F);
    rcmd root@&quot;$ip&quot; &quot;if ! [[ -d $backup_dir ]];then mkdir $backup_dir;fi; tar czfP $backup_dir/mongodb.tar.gz $INSTALL_PATH/public/mongodb/&quot;;
done</code></pre>


<ul>
<li>拉起 MongoDB 服务</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcec start mongodb</code></pre>


<h3 id="zookeeper">备份 Zookeeper</h3>
<ul>
<li>备份 Zookeeper 数据目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">for ip in ${ZK_IP[@]};do
    backup_dir=/data/zk_dirbak_$(date +%F);
    rcmd root@&quot;$ip&quot; &quot;if ! [[ -d $backup_dir ]];then mkdir $backup_dir;fi; tar czfP $backup_dir/zk.tar.gz $INSTALL_PATH/public/zk/&quot;;
done</code></pre>


<h3 id="rabbitmq">备份 Rabbitmq</h3>
<ul>
<li>备份 Rabbitmq 数据目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">for ip in ${RABBITMQ_IP[@]}; do
    backup_dir=/data/rabbitmq_dirbak_$(date +%F);
    ssh root@&quot;$ip&quot; &quot;if ! [[ -d $backup_dir ]];then mkdir $backup_dir;fi; tar czfP $backup_dir/rabbitmq.tar.gz $INSTALL_PATH/public/rabbitmq/&quot;;
done</code></pre>


<h3 id="src">备份 src 目录</h3>
<pre class="codehilite"><code class="language-bash"># 中控机执行，请用 mv 备份 src 目录。
mv /data/src/ /data/src.bak</code></pre>


<h3 id="install">备份 install 目录</h3>
<pre class="codehilite"><code class="language-bash"># 请不要使用 mv 命令备份，一定要使用 cp 备份 install 目录，不然会导致 install/.app.token发生改变
cp -a /data/install /data/install.bak</code></pre>


<h3 id="python">备份 Python 解释器</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
for i in ${ALL_IP[@]};do ssh $i 'for py in py27 py27_e py36 py36_e; do [[ -d /opt/$py ]] &amp;&amp; mv /opt/$py /opt/&quot;$py&quot;_bak; done'; done</code></pre>


<h3 id="_14">备份模块分布标记文件</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
for i in ${ALL_IP[@]};do ssh $i 'mv /data/bkce/.installed_module /data/bkce/.installed_module.bak'; done</code></pre>


<h3 id="_15">备份模块安装标记文件</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
for i in ${ALL_IP[@]};do ssh $i 'mv /data/install/.bk_install.step /data/install/.bk_install.step.bak'; done</code></pre>


<h2 id="_16">更新软件包及相关文件</h2>
<h3 id="v60">更新 V6.0 软件包</h3>
<pre class="codehilite"><code class="language-bash">tar xvf bkce_src-6.0.3.tgz -C /data</code></pre>


<h3 id="_17">解压各个产品包</h3>
<pre class="codehilite"><code class="language-bash">cd /data/src/; for f in *gz;do tar xf $f; done</code></pre>


<h3 id="rpm-opt">拷贝 rpm 包文件夹到/opt/目录</h3>
<pre class="codehilite"><code class="language-bash">cp -a /data/src/yum /opt</code></pre>


<h3 id="_18">恢复环境变量文件</h3>
<pre class="codehilite"><code class="language-bash">cp /tmp/install/bin/01-generate/* /data/install/bin/01-generate/
cp /tmp/install/bin/03-userdef/* /data/install/bin/03-userdef/</code></pre>


<h3 id="installconfig">更新 install.config 配置</h3>
<p>请参考 <a href="./update_install_config_for_v6.md">社区版 5.1-6.0 install.config 配置</a></p>
<h3 id="_19">主机免密</h3>
<p><font color="#dd0000">仅新增主机升级需要操作。</font></p>
<pre class="codehilite"><code class="language-bash">./configure_ssh_without_pass</code></pre>


<h3 id="_20">恢复证书</h3>
<ul>
<li>如原 license 模块分布未发生改变，请按下述步骤操作：</li>
</ul>
<pre class="codehilite"><code class="language-bash">cp -a /data/src.bak/cert /data/src/</code></pre>


<ul>
<li>如原 license 模块分布发生改变，请按下述步骤操作：</li>
</ul>
<p>请前往 <a href="https://bk.tencent.com/download_ssl/">蓝鲸官网</a> 重新生成证书。将生成的证书包上传至中控机 /data 目录</p>
<pre class="codehilite"><code class="language-bash">install -d -m 755 /data/src/cert
tar xf /data/ssl_certificates.tar.gz -C /data/src/cert/</code></pre>


<h3 id="_21">初始化操作</h3>
<p>生成蓝鲸部署时所需的环境变量以及资源。</p>
<pre class="codehilite"><code class="language-bash">./bk_install common</code></pre>


<h3 id="_22">初始化资源检查</h3>
<pre class="codehilite"><code class="language-bash">cd /data/install
./health_check/check_bk_controller.sh</code></pre>


<h2 id="_23">开源组件升级</h2>
<h3 id="consul">升级 consul</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install consul &amp;&amp; echo &quot;install consul&quot; &gt;&gt; /data/install/.bk_install.step
./bkcli start consul &amp;&amp; echo &quot;start consul&quot; &gt;&gt; /data/install/.bk_install.step</code></pre>


<h3 id="mysql_1">升级 MySQL</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install mysql &amp;&amp; echo &quot;install mysql&quot; &gt;&gt;/data/install/.bk_install.step
./bkcli start mysql &amp;&amp; echo &quot;start mysql&quot; &gt;&gt;/data/install/.bk_install.step</code></pre>


<h4 id="mysql_2">恢复 MySQL 数据</h4>
<pre class="codehilite"><code class="language-bash"># 登录至 MySQL 机器
source /data/install/utils.fc
ssh $BK_MYSQL_IP

# 恢复数据
mysql --login-path=default-root --default-character-set=utf8  &lt; /data/dbbak/bk_mysql_alldata.sql</code></pre>


<h3 id="mongodb_1">升级 MongoDB</h3>
<p>参考 <a href="./update_mongodb_for_v6.md">蓝鲸社区版 5.1 mongodb 升级文档</a></p>
<h3 id="rabbitmq_1">解决 Rabbitmq 依赖冲突</h3>
<pre class="codehilite"><code class="language-bash"># 卸载之前的依赖
./pcmd.sh -H $BK_RABBITMQ_IP &quot;yum -y remove rabbitmq-server.noarch  erlang-*&quot;</code></pre>


<h3 id="kafka">升级 Kafka</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install kafka  &amp;&amp; echo &quot;install kafka&quot; &gt;&gt; /data/install/.bk_install.step</code></pre>


<p><font color="#dd0000">新增机器请忽略该步骤</font></p>
<p>由于 Kafka 版本原因，以及由原来的集群变为单点。所以配置文件中的 <code>broker.id</code> 会有所变化，在启动 Kafka 时会报错。所以需要先做如下修改，修改后再启动 kafka :</p>
<pre class="codehilite"><code class="language-bash"># 登录至 Kafka 机器
source /data/install/utils.fc
ssh $BK_KAFKA_IP

# 查看升级 Kafka 后的 server.properties 文件中的 broker.id。将 meta.properties 中的 broker.id 与 server.properties文件中的保持一致
# x 为实际的 broker.id
grep &quot;broker.id&quot; /data/bkce/public/kafka/meta.properties
broker.id=x

# 替换 server.properties 中的 broker.id 。 请将下述的 x 替换成实际的值
sed -i &quot;s/broker.id=.*/broker.id=x/g&quot; /etc/kafka/server.properties

# 修改 kakfa 数据目录属组属主
chown -R kafka.kafka /data/bkce/public/kafka</code></pre>


<h2 id="_24">升级蓝鲸组件</h2>
<h3 id="paas">升级 PaaS 平台</h3>
<p><strong>注意：</strong> 确定所有的 SaaS 已下线</p>
<ul>
<li>升级前需先生成前置 SQL 文件，并将该 SQL 文件导入指定数据库。</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 生成前置 SQL 文件
cat &gt; /data/change_paas.sql &lt;&lt;EOF
use open_paas;
insert into django_migrations(app, name, applied) value('bkcore', '0010_auto_20171110_1004', Now());
insert into django_migrations(app, name, applied) value('bkcore', '0011_auto_20171116_1205', Now());
insert into django_migrations(app, name, applied) value('bkcore', '0012_auto_20180622_1815', Now());
insert into django_migrations(app, name, applied) value('home', '0004_auto_20200714_1627', Now());
delete from auth_permission where content_type_id in (select id from django_content_type where app_label='app' and model='desktopsettings');
delete from django_content_type where app_label='app' and model='desktopsettings';
EOF</code></pre>


<ul>
<li>导入 SQL 文件并验证</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 导入 SQL 文件
mysql --login-path=mysql-default &lt; /data/change_paas.sql

# 查询验证
mysql --login-path=mysql-default  -e &quot;use open_paas;select  app,name,applied from django_migrations where app='bkcore' order by name desc  limit 5;&quot;</code></pre>


<ul>
<li>由于 5.1 的 PaaS 是未加密版本，所以在升级的过程中，会出现加密的报错。需先删掉 PaaS 的旧虚拟环境后再升级 PaaS。</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

./pcmd.sh -H $BK_PAAS_IP &quot;rmvirtualenv open_paas-apigw open_paas-appengine open_paas-esb open_paas-login open_paas-paas&quot;</code></pre>


<ul>
<li>开始升级</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bk_install paas</code></pre>


<h3 id="app_mgr">升级 app_mgr</h3>
<pre class="codehilite"><code class="language-bash">./bk_install app_mgr</code></pre>


<h3 id="_25">部署权限中心和用户管理</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_iam
./bk_install saas-o bk_user_manage</code></pre>


<h4 id="_26">迁移用户管理数据</h4>
<blockquote>
<p>验证：执行完下述命令后，打开用户管理 -&gt; 组织架构 -&gt; 默认目录 -&gt; 总公司。检查原 5.1 上的用户是否存在。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash"># 登陆 usermgr 服务器，执行脚本
source /data/install/utils.fc
ssh $BK_USERMGR_IP

# 进入用户管理虚拟环境
workon usermgr-api

source /data/install/utils.fc
# 加载相关环境变量
export MYSQL_IP0=$BK_PAAS_MYSQL_HOST
export MYSQL_PORT=$BK_PAAS_MYSQL_PORT
export MYSQL_USER=$BK_PAAS_MYSQL_USER
export MYSQL_PASS=$BK_PAAS_MYSQL_PASSWORD
export DJANGO_SETTINGS_MODULE=config.ce.prod
export BK_FILE_PATH=&quot;/data/bkce/usermgr/cert/saas_priv.txt&quot;

# 迁移数据前，查看迁移内容
python manage.py migrate_from_ce_5dot1 --dry_run   # WARNING 输出为正常

# 迁移内容无误后，开始迁移
python manage.py migrate_from_ce_5dot1 &gt; migrate.log</code></pre>


<h3 id="cmdb">升级 CMDB</h3>
<pre class="codehilite"><code class="language-bash">./bk_install cmdb

# 授权原主机导入的 xlsx 目录
./pcmd.sh -m cmdb &quot;chown -R blueking.blueking /tmp/template&quot;</code></pre>


<h3 id="_27">升级作业平台</h3>
<pre class="codehilite"><code class="language-bash">./bk_install job</code></pre>


<h4 id="job">JOB 数据迁移</h4>
<ul>
<li>在执行 JOB 数据迁移时，请先执行如下命令，将 JOB 加入至权限中心白名单</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 添加白名单 （中控机执行）
mysql --login-path=mysql-default -e &quot;insert into bk_iam.authorization_authapiallowlistconfig(creator, updater, created_time, updated_time, type, system_id, object_id) value('', '', now(), now(), 'authorization_instance', 'bk_job', 'use_account');&quot;

# 确认是否已插入
mysql --login-path=mysql-default -e &quot;select * from bk_iam.authorization_authapiallowlistconfig where type='authorization_instance' and system_id='bk_job'&quot;</code></pre>


<ul>
<li>
<p>开始迁移</p>
<p>下载迁移工具：job-migration-ce_0.1.2_Linux_x86_64.tar.gz</p>
<p>```bash</p>
<h1 id="readmemd">请按照仔细阅读目录下 README.md 文档</h1>
<p>tar -xvf /data/job-migration-ce_0.1.2_Linux_x86_64.tar.gz -C /data
cd /data/job-migration-ce_0.1.2_Linux_x86_64
```</p>
<ul>
<li>加载环境变量</li>
</ul>
<p><code>bash
source /data/install/utils.fc</code></p>
<ul>
<li>生成 config.toml 文件。<code>生成后请检查该文件内的相关变量是否转化成具体的值。</code></li>
</ul>
<p>```bash
cat &gt; config.toml &lt;&lt; EOF
jobManageHost = "http://$BK_JOB_IP:$BK_JOB_MANAGE_SERVER_PORT"
jobCrontabHost = "http://$BK_JOB_IP:$BK_JOB_CRONTAB_SERVER_PORT"
processScript = true
processPlan = true
processCron = true
processWhiteList = true
offset = 0
includeAppId = ""
excludeAppId = ""
test = false</p>
<h1 id="id-11">如果不需要更改业务 ID 则可以去掉。配置成 1=1 也不影响</h1>
<p>[appMapper]
1 = 1</p>
<p>[mysql]
host = "$BK_MYSQL_IP"
port = 3306
username = "$BK_MYSQL_ADMIN_USER"
password = "$BK_MYSQL_ADMIN_PASSWORD"
database = "job"</p>
<p>[log]
level = "info"</p>
<p>[jwt]
RSAPublicKey = "$BK_JOB_SECURITY_PUBLIC_KEY_BASE64"</p>
<p>RSAPrivateKey = "$BK_JOB_SECURITY_PRIVATE_KEY_BASE64"</p>
<p>EOF
```</p>
<ul>
<li>迁移 JOB 脚本数据</li>
</ul>
<p><code>bash
./job-migration-ce</code></p>
</li>
</ul>
<h4 id="job_1">JOB 帐号迁移</h4>
<p>下载迁移工具：job-account-perm-migration_v0.0.0-next_Linux_x86_64.tar.gz</p>
<pre class="codehilite"><code class="language-bash"># 请按照仔细阅读目录下 README.md 文档
tar -xvf /data/job-account-perm-migration_v0.0.0-next_Linux_x86_64.tar.gz -C /data/
cd /data/job-account-perm-migration_v0.0.0-next_Linux_x86_64</code></pre>


<ul>
<li>加载环境变量</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc</code></pre>


<ul>
<li>生成 config.toml 文件。 <code>生成后请检查该文件内的相关变量是否转化成具体的值。</code></li>
</ul>
<pre class="codehilite"><code class="language-bash">cat &gt; config.toml &lt;&lt; EOF

jobGatewayHost = &quot;http://$BK_JOB_GATEWAY_HTTP_PRIVATE_ADDR&quot;
esbHost = &quot;http://$BK_PAAS_PRIVATE_ADDR&quot;
includeAppId = &quot;&quot;
excludeAppId = &quot;&quot;
appCode = &quot;$BK_JOB_APP_CODE&quot;
appSecret = &quot;$BK_JOB_APP_SECRET&quot;
iamHost = &quot;$BK_IAM_PRIVATE_URL&quot;

[appMapper]

[mysql]
host = &quot;$BK_MYSQL_IP0&quot;
port = 3306
username = &quot;$BK_MYSQL_ADMIN_USER&quot;
password = &quot;$BK_MYSQL_ADMIN_PASSWORD&quot;
database = &quot;job&quot;

[log]
level = &quot;info&quot;
EOF</code></pre>


<ul>
<li>执行升级脚本</li>
</ul>
<pre class="codehilite"><code class="language-bash">./job-account-perm-migration</code></pre>


<h4 id="job_2">迁移 JOB 上传文件目录</h4>
<pre class="codehilite"><code class="language-bash"># 这里以默认的 /data/bkce/ 目录为例，升级过程请以实际的为准
source /data/install/utils.fc
ssh $BK_JOB_IP

cd /data/bkce/public/job/

# 如果未进行过文件分发，不会生成 localupload ，可手动创建
mkdir localupload
cp -a -r  data1/localupload/* localupload/
chown -R blueking.blueking /data/bkce/public/job/localupload/</code></pre>


<h3 id="_28">升级节点管理</h3>
<ul>
<li>如有涉及到 proxy 请参考 <a href="https://bk.tencent.com/docs/document/6.0/127/7917">开启 Proxy</a></li>
</ul>
<h4 id="_29">升级前置准备</h4>
<ul>
<li>同步节点管理文件</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcli sync nodeman</code></pre>


<ul>
<li>同步升级脚本文件</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机
cd /data/install
./sync.sh nodeman /data/upgrade.py /data/</code></pre>


<h5 id="_30">创建节点管理升级环境</h5>
<ul>
<li>登录到节点管理机器，创建升级所需目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/load_env.sh
ssh $BK_NODEMAN_IP

# 创建升级文件存放目录
mkdir /data/bkce/nodeman_update

# 将 upgrade.py 放置 /data/bkce/nodeman_update 目录下，假设原先该文件放置于 /data 目录
cp -a /data/upgrade.py /data/bkce/nodeman_update/</code></pre>


<ul>
<li>生成 requirements.txt 文件</li>
</ul>
<pre class="codehilite"><code class="language-bash">cat &gt; /data/bkce/nodeman_update/requirements.txt &lt;&lt; EOF
pymysql
requests
pycryptodome
pycryptodomex
EOF</code></pre>


<ul>
<li>创建节点管理升级虚拟环境目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">cd /data/install
./bin/install_py_venv_pkgs.sh -e -p /opt/py36/bin/python -n nodeman_update -a /data/bkce/nodeman_update -s /data/src/bknodeman/support-files/pkgs  -r /data/bkce/nodeman_update/requirements.txt</code></pre>


<ul>
<li>执行升级脚本</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
workon nodeman_update

# 注意：$NODEMAN_APP_CODE 和 $NODEMAN_APP_SECRET 是指节点管理 SaaS 的应用 ID 和应用 TOKEN。且此时的 SaaS 状态处于下线状态，需要将隐藏的 SaaS 显示才能找到节点管理的应用。
# 可以在 &quot;PaaS 平台 -&gt; 开发者中心 -&gt;  S-mart 应用 -&gt; 显示已下架应用 -&gt; 节点管理&quot; 进行查看，然后使用实际的值进行替换即可。

python upgrade.py -a $NODEMAN_APP_CODE  -s $NODEMAN_APP_SECRET -t $BK_MYSQL_IP0 -u $BK_NODEMAN_MYSQL_USER -p $BK_NODEMAN_MYSQL_PASSWORD -o $BK_NODEMAN_MYSQL_PORT</code></pre>


<h4 id="_31">开始升级</h4>
<pre class="codehilite"><code class="language-bash">./bk_install bknodeman</code></pre>


<ul>
<li>迁移 SaaS 数据：</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 登陆至 APPO 机器
source /data/install/utils.fc
ssh $BK_APPO_IP

# 进入节点管理容器内
docker exec -it $(docker ps |awk '/bk_nodeman/{print $1}') /bin/bash

# 开始数据迁移。
export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;
/cache/.bk/env/bin/python /data/app/code/manage.py sync_cmdb_cloud_area
/cache/.bk/env/bin/python /data/app/code/manage.py sync_cmdb_host
/cache/.bk/env/bin/python /data/app/code/manage.py sync_agent_status
/cache/.bk/env/bin/python /data/app/code/manage.py sync_plugin_status</code></pre>


<h3 id="_32">监控平台</h3>
<h4 id="_33">升级监控平台</h4>
<pre class="codehilite"><code class="language-bash">./bk_install bkmonitorv3</code></pre>


<h4 id="_34">监控配置迁移</h4>
<p><strong>注意：</strong> 不支持原 5.1 的组件监控迁移。</p>
<p>监控平台部署完成后，请登录蓝鲸监控平台，进入到监控平台 Web 页面，在左侧导航栏中找到【配置升级】然后开始数据迁移</p>
<ul>
<li>迁移步骤：</li>
<li>点击开始迁移。</li>
<li>选择迁移的内容后，点击开始迁移，然后查看迁移状态。</li>
<li>迁移完成后，会存在相同的监控策略，为避免重复告警，请停用旧的监控策略。</li>
</ul>
<p><img alt="bkmonitorv3" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/update_bkmonitorv3.png" /></p>
<h3 id="_35">日志平台</h3>
<p><strong>日志平台迁移后，只是将原采集配置任务迁移，需要手动重新下发任务才能生效，请知悉。</strong></p>
<h4 id="_36">支持&amp;不支持迁移的内容</h4>
<ul>
<li>迁移内容</li>
<li>支持迁移</li>
<li>采集配置项数据<ul>
<li>迁移的字段：<code>采集 IP</code>，<code>采集路径</code>。不支持迁移 <code>排除文件类型</code> 和 <code>过期时间</code></li>
<li>迁移后为草稿状态，此时未下发采集配置。需要点击保存方可下发配置</li>
</ul>
</li>
<li>不支持迁移</li>
<li>ES 数据</li>
<li>监控策略</li>
<li>
<p>角色权限</p>
</li>
<li>
<p>升级日志平台</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bk_install bklog</code></pre>


<ul>
<li>执行变更脚本</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 在 APPO 机器执行以下命令
source /data/install/utils.fc
ssh $BK_APPO_IP

# 进入 bk_log_search 的 docker 容器
docker exec -it $(docker ps |awk '/bk_log_search/{print $1}') /bin/bash

# 进入容器后，修改语言配置、进入工作目录
export LC_ALL=en_US.UTF-8
cd /data/app/code

# 查看升级用户名单（仅展示但不执行，用于做确认）
# bk_biz_id 可选，不提供则代表全业务
export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;
/cache/.bk/env/bin/python manage.py iam_list_upgrade [bk_biz_id]

# 执行升级，向权限中心同步操作权限
# bk_biz_id 可选，不提供则代表全业务
/cache/.bk/env/bin/python manage.py iam_do_upgrade [bk_biz_id]

# 执行配置迁移
/cache/.bk/env/bin/python manage.py migrate_v2_config</code></pre>


<h3 id="_37">升级故障自愈</h3>
<ul>
<li>升级故障自愈之前，需要对原来的日志目录权限做下修改，6.0 之前的启动用户是 root，在启动故障自愈时会出现权限问题，所以需要将原来的属主属组修改成 blueking。<font color="#dd0000">新增机器请忽略该步骤</font></li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机执行
./pcmd.sh -H $BK_FTA_IP  &quot;chown -R blueking.blueking $BK_HOME/logs/fta/&quot;</code></pre>


<ul>
<li>开始升级</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bk_install fta</code></pre>


<h3 id="_38">升级标准运维</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_sops

# # 在 APPO 机器执行以下命令
source /data/install/utils.fc
ssh $BK_APPO_IP

# 进入 bk_sops 的 docker 容器
docker exec -it $(docker ps |awk '/bk_sops/{print $1}') /bin/bash

export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;
cd /data/app/code &amp;&amp; python manage.py task_model_migrate</code></pre>


<h3 id="_39">流程服务</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_itsm</code></pre>


<h3 id="_40">权限中心同步用户组织架构</h3>
<p>同步用户管理数据，确保是最新的组织架构数据</p>
<blockquote>
<p>依赖 IAM V3 后台服务、IAM V3 SaaS、用户管理 和 PaaS（ESB）、必须保证需要迁移权限的系统，对应权限模型已注册</p>
</blockquote>
<pre class="codehilite"><code class="language-bash"># 登陆至 APPO 机器
source /data/install/utils.fc
ssh $BK_APPO_IP

# 进入 iam 容器内
docker exec -it $(docker ps | grep -Fw bk_iam | awk '{print $1}') bash

# 同步架构数据
export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;
/cache/.bk/env/bin/python /data/app/code/manage.py shell

from backend.apps.organization.tasks import sync_organization
sync_organization()</code></pre>


<h3 id="_41">迁移权限中心数据</h3>
<ul>
<li>将权限中心的升级包下载至中控机的 <code>/data</code> 目录后解压</li>
</ul>
<pre class="codehilite"><code class="language-bash">tar -xvf /data/iam_v3_legacy_1.0.16_for_ce.tgz -C /data
cd /data/iam_v3_legacy_1.0.16_for_ce</code></pre>


<ul>
<li>执行 v3 相关权限数据导出到文件</li>
</ul>
<pre class="codehilite"><code class="language-bash">bash mysqldump_bk_iam_data.sh -d bk_iam -p $BK_MYSQL_ADMIN_PASSWORD -P 3306 -b $BK_MYSQL_IP0</code></pre>


<ul>
<li>执行导出配置业务和标准运维项目数据到 CSV 文件</li>
</ul>
<pre class="codehilite"><code class="language-bash">bash ./edition/mysqldump_bk_sops_data.sh -d bk_sops -p $BK_MYSQL_ADMIN_PASSWORD -P 3306 -b $BK_MYSQL_IP0

/opt/py27/bin/python -m edition.dump_biz_data -s $BK_IAM_APP_SECRET &lt;iam SaaS 的 app secret，可由页面获取&gt;  -t $BK_PAAS_PRIVATE_ADDR</code></pre>


<h3 id="_42">创建对应业务运维组</h3>
<p><strong>在升级的过程中，默认只创建对应业务下的运维组，如之前涉及的开发、测试等角色人员，需自行创建对应的用户组。</strong></p>
<blockquote>
<p>验证：执行完下述命令后，打开权限中心 -&gt; 右上角切换身份至超级管理 -&gt; 用户组。查看是否建立了对应业务的用户组。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">/opt/py27/bin/python -m edition.migrate_biz_group -s $BK_IAM_APP_SECRET &lt;iam SaaS的app secret，可由页面获取&gt;  -t $BK_PAAS_PRIVATE_ADDR</code></pre>


<h3 id="_43">创建对应业务运维模板</h3>
<p><strong>在升级的过程中，默认只创建对应业务下的运维模板，如之前涉及的开发、测试等角色人员，需自行创建对应的模板。</strong></p>
<ul>
<li>创建 CMDB 的业务模板</li>
</ul>
<blockquote>
<p>验证：执行完下述命令后，打开权限中心 -&gt;  右上角切换身份至超级管理 -&gt; 权限模版。查看是都建立对对应业务的配置平台运维模版。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">/opt/py27/bin/python -m edition.migrate_biz_policy -s $BK_IAM_APP_SECRET &lt;iam SaaS 的 app secret，可由页面获取&gt;  -t $BK_PAAS_PRIVATE_ADDR -e bk_cmdb -E ce -f &lt;配置平台空闲机目录 ID，获取方式请往下看&gt;</code></pre>


<p><strong>配置平台空闲机目录 ID 查询方式：</strong></p>
<pre class="codehilite"><code class="language-bash"># 登陆至 mongodb 机器
source /data/install/utils.fc
ssh $BK_MONGODB_IP

# 登陆 MongoDB 查询
source /data/install/utils.fc
mongo -u $BK_MONGODB_ADMIN_USER -p $BK_MONGODB_ADMIN_PASSWORD mongodb://$BK_MONGODB_IP:27017/admin?replicaSet=rs0


# &quot;bk_module_id&quot; : NumberLong(1) 中的 1 即为配置平台空闲机目录ID
use cmdb
db.cc_ModuleBase.find({default: 1, bk_biz_id: db.cc_ApplicationBase.findOne({default:1, bk_supplier_account:&quot;0&quot;}).bk_biz_id},{bk_module_id:1,bk_module_name:1,_id:0}).pretty()</code></pre>


<ul>
<li>创建 JOB、节点管理、监控平台、日志平台、标准运维权限模板</li>
</ul>
<pre class="codehilite"><code class="language-bash"># bk_iam_app_secret 中的值请使用实际的值替换。可由页面获取权限中心 SaaS 的 应用 TOKEN

bk_iam_app_secret=&quot;xxxxxxxx&quot;
modules=(bk_job bk_nodeman bk_monitorv3 bk_log_search bk_sops)

for module in ${modules[@]}
do
    /opt/py27/bin/python -m edition.migrate_biz_policy -s ${bk_iam_app_secret} -t $BK_PAAS_PRIVATE_ADDR -e ${module} -E ce
done</code></pre>


<h2 id="_44">蓝鲸业务拓扑升级</h2>
<p>从 5.1 升级到 6.0 后，如果没有对原拓扑进行升级，蓝鲸监控会出现端口或者进程不存在的告警。<strong>&lt;该类告警可忽略&gt;</strong></p>
<p>升级请见 ：<a href="./update_bktopo_for_v6.md">社区版 5.1-6.0 蓝鲸业务拓扑升级</a></p><h1 id="51-604">社区版 5.1 - 6.0.4 升级指引</h1>
<h2 id="_1">适用范围</h2>
<ul>
<li>社区版 5.1 - 6.0.4</li>
</ul>
<h2 id="_2">准备机器</h2>
<h3 id="_3">套餐拆分说明</h3>
<ol>
<li>从社区版 6.0.3 开始，原社区版完整包已拆分为基础套餐与监控日志套餐：</li>
<li><strong>基础套餐</strong>：PaaS 平台、配置平台、作业平台、权限中心、用户管理、节点管理、标准运维、流程服务。</li>
<li><strong>监控日志套餐</strong>：监控平台、日志平台、故障自愈。</li>
<li>为了保证环境的稳定，建议各个套餐使用单独的机器资源部署</li>
</ol>
<h3 id="_4">配置评估</h3>
<ol>
<li>社区版 5.1 的最低机器配置要求为：1 台 4 核 16G + 2 台 4 核 8G</li>
<li>社区版 6.0 基础套餐的最低机器配置要求为：3 台 4 核 16G</li>
<li>社区版 6.0 监控日志套餐的最低机器配置要求为：1 台 8 核 16G</li>
</ol>
<h3 id="_5">机器准备建议</h3>
<ol>
<li>现有环境机器配置满足：3 台 4 核 16G，则需要增加 1 台 8 核 16G 部署监控日志套餐，升级请参考 <a href="./update_install_config_for_v6.md#新增主机进行升级">新增主机进行升级</a></li>
<li>现有环境机器配置满足：3 台 8 核 32G，可不增加机器直接升级（不建议），升级请参考 <a href="./update_install_config_for_v6.md#原机器配置进行升级">原机器配置进行升级</a></li>
</ol>
<h2 id="_6">风险提示</h2>
<ul>
<li>请仔细阅读本升级文档，避免因未注意相关细节造成误操作。</li>
<li>如无特殊说明，所述操作均在中控机执行。</li>
<li>原蓝鲸官方 SaaS 必须提前下架，否则将影响 SaaS 升级部署。</li>
<li>请严格按照本文档步骤进行升级，如升级过程存在问题，请先解决该问题后再继续往下执行升级。</li>
<li>非标准私有 IP 用户需在解压新的脚本后，需要按照以前修改 <a href="https://bk.tencent.com/docs/document/6.0/127/7543">非标准私有 IP</a> 的方式重新修改。</li>
<li>如果 MySQL 备份参考本升级文档的备份方式，涉及到有自行开发的 SaaS 应用，请重新前往 MySQL 重新授权。</li>
<li>本次升级务必保证 MySQL/MongoDB 机器磁盘空间充足，避免磁盘空间不足导致备份失败。</li>
<li>本升级方案不负责迁移 5.1 中的监控数据，包括开源组件中 influxdb 和 es 的数据，监控数据将会丢失，请知悉。</li>
<li>本次升级方案为停服更新，包含多个开源组件版本、官方组件版本的升级，升级时间较长，请避开业务繁忙时期进行升级。</li>
<li>本次升级相关产品有新增进程等，请在升级前先对原主机资源(内存、CPU 等)进行评估是否足够，可参考官网给出的 <a href="https://bk.tencent.com/download/">机器配置</a> 进行评估。</li>
<li>本升级方案仅适用于未做过任何改造的用户，若有定制化调整（如接入企业登陆，新增 API 以及接入其他企业内部系统），或部分产品为开源产品不适用本升级指引，需自行维护特殊化部分功能。</li>
</ul>
<h2 id="_7">重点提前知</h2>
<p><strong>升级完之后：</strong></p>
<ul>
<li>请前往节点管理升级 agent、proxy 以及各插件至最新版本。</li>
<li>因社区版 6.0 相关接口变化，升级完成后会导致服务商的 SaaS 不可用，请知悉。</li>
</ul>
<h2 id="_8">升级前置准备</h2>
<p>下述所有升级步骤均以默认的安装目录 <code>/data/bkce</code> 为例，如使用自定义安装目录请在相关操作前进行替换。</p>
<p>1.下载软件包以及迁移工具，并将其放置 /data 目录</p>
<table>
<thead>
<tr>
<th>软件包</th>
<th>下载地址</th>
<th>MD5</th>
<th>备注</th>
</tr>
</thead>
<tbody>
<tr>
<td>bkce_src_6.0.4.tar.gz</td>
<td><a href="https://bkopen-1252002024.file.myqcloud.com/ce/bkce_src-6.0.4.tgz">https://bkopen-1252002024.file.myqcloud.com/ce/bkce_src-6.0.4.tgz</a></td>
<td>1beeb0814149e0bbc182094be5cb44fb</td>
<td>蓝鲸完整包</td>
</tr>
<tr>
<td>迁移工具合集</td>
<td><a href="https://bkopen-1252002024.file.myqcloud.com/ce/ce6.0_upgrade_tools.zip">https://bkopen-1252002024.file.myqcloud.com/ce/ce6.0_upgrade_tools.zip</a></td>
<td>5a7632530948e0733368f859c4db609d</td>
<td>包含下表所有迁移工具</td>
</tr>
<tr>
<td>upgrade.py</td>
<td>-</td>
<td>4683f0f7d5136c1799b5010f8960d7e3</td>
<td>节点管理升级脚本</td>
</tr>
<tr>
<td>migrate_old_environ_v2.sh</td>
<td>-</td>
<td>4ae6c6f2a1ccb4658c7a124857561d67</td>
<td>旧变量转换脚本</td>
</tr>
<tr>
<td>iam_v3_legacy_1.0.16_for_ce.tgz</td>
<td>-</td>
<td>106f8a90f243be85743ff7baf1d0eafc</td>
<td>权限中心迁移脚本</td>
</tr>
<tr>
<td>job-migration-ce_0.1.2_Linux_x86_64.tar.gz</td>
<td>-</td>
<td>3949713d37668535915bf03a4dd09a6e</td>
<td>JOB 升级脚本</td>
</tr>
<tr>
<td>job-account-perm-migration_v0.0.0-next_Linux_x86_64.tar.gz</td>
<td>-</td>
<td>5eebb26767debc18d2620ec0840573bf</td>
<td>JOB 帐户迁移</td>
</tr>
</tbody>
</table>
<p>2.升级前，请检查环境各主机资源情况，避免升级过程中出现内存或者磁盘不足等情况。配置请参考 <a href="https://bk.tencent.com/download/">蓝鲸官网下载页</a> 。</p>
<p>3.当数据库的数据量过大时，可以考虑使用 truncate 或 delete 的方式，清空监控告警表的数据 <strong>（该项由用户自主决定是否清理该表的数据）</strong>。</p>
<ul>
<li>库名：bkdata_monitor_alert</li>
<li>表名：ja_alarm_alarminstance</li>
</ul>
<h3 id="saas">下架官方 SaaS</h3>
<p>请访问蓝鲸 PaaS 平台，通过【开发者中心】-&gt;【 S-mart 应用】下架所有官方 SaaS。</p>
<h3 id="_9">解压迁移工具包</h3>
<pre class="codehilite"><code class="language-bash">unzip ce6.0_upgrade_tools.zip -d /data/</code></pre>


<h3 id="_10">迁移配置文件相关变量</h3>
<p>将社区版 5.1 的环境变量转换成社区版 6.0 的环境变量。请保存好生成的文件。
该脚本会在中控机生成 <code>${HOME}/.tag/dbadmin.env</code> 标记文件，请在正式升级时确认该文件是否存在。</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

cd /data
bash migrate_old_environ_v2.sh</code></pre>


<h3 id="_11">蓝鲸用户检查</h3>
<p>社区版 6.0 中蓝鲸组件统一由 <code>blueking</code> 用户管控，需要在所有蓝鲸后台服务器中创建 id 为 10000 的 blueking 用户。
如已存在 id 为 10000 的用户，请自行处理。</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
for ip in ${ALL_IP[@]}; do
    ssh ${ip} &quot;if id 10000 &gt; /dev/null; then echo &quot;${ip} 已存在 id 为 10000 的用户&quot;;fi&quot;
done</code></pre>


<h3 id="_12">停止相关服务进程</h3>
<p>登陆每台机器，注释掉蓝鲸相关的cron任务</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
# 停止蓝鲸相关服务
echo fta bkdata appo appt gse job cmdb paas redis nginx license kafka es beanstalk influxdb zk rabbitmq consul | xargs -n1 ./bkcec stop

# 观察进程是否已经停止，如果没有停止，可手动强制停止
echo fta bkdata appo appt gse job cmdb paas redis nginx license kafka es beanstalk influxdb zk rabbitmq consul | xargs -n1 ./bkcec status</code></pre>


<h2 id="_13">数据备份</h2>
<h3 id="mysql">备份 MySQL</h3>
<p><strong>备份前，请确认使用到 MySQL 的相关服务已停止，避免出现数据不一致的问题。</strong>
该备份方式仅供参考，可自行选择备份方式。</p>
<ul>
<li>登陆至 MySQL 机器，创建备份目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
ssh $MYSQL_IP

# 创建备份目录
source /data/install/utils.fc
mkdir -p /data/dbbak
cd /data/dbbak</code></pre>


<ul>
<li>生成备份脚本</li>
</ul>
<p><strong>注意:</strong> 该备份方式不包含 MySQL 默认库的备份，所以涉及自行开发的 SaaS 应用使用到的帐户密码会丢失。如无，可参考如下方式进行备份。</p>
<pre class="codehilite"><code class="language-bash"># joblog 在升级的过程中可以不需要备份，可以加入到 ignoredblist 列表里。但是为了后续回滚，请确保 joblog 已存在有一份备份数据。

cat &gt;dbbackup_mysql.sh &lt;&lt;EOF
#!/bin/bash

ignoredblist='information_schema|mysql|test|db_infobase|performance_schema|sys'

dblist=&quot;\$(mysql -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_IP -P$MYSQL_PORT -Nse &quot;show databases;&quot;|grep -Ewv &quot;\$ignoredblist&quot;|xargs echo)&quot;

mysqldump -u$MYSQL_USER -p$MYSQL_PASS -h$MYSQL_IP -P$MYSQL_PORT  --skip-opt --create-options --default-character-set=utf8mb4 -R  -E -q -e --single-transaction --no-autocommit --master-data=2 --max-allowed-packet=1G  --hex-blob  -B  \$dblist &gt; /data/dbbak/bk_mysql_alldata.sql

EOF</code></pre>


<ul>
<li>开始备份</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 如果不存在 mysql 命令可以手动安装（非必选）
yum -y install mysql

# 执行备份操作
bash dbbackup_mysql.sh

# 请检查导出是否正确
grep 'CREATE DATABASE' bk_mysql_alldata.sql</code></pre>


<ul>
<li>停止服务</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机操作
./bkcec stop mysql
./bkcec status mysql

# 查看是否存在残余进程
rcmd &quot;root@$MYSQL_IP&quot; &quot;ps -ef | grep mysql&quot;</code></pre>


<h3 id="mongodb">备份 MongoDB</h3>
<p>该备份方式仅供参考，可自行选择备份方式。</p>
<ul>
<li>登陆至 MongoDB 机器，创建备份目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
ssh $MONGODB_IP

# 创建备份目录
mkdir -p /data/mongodb_bak</code></pre>


<ul>
<li>开始备份 MongoDB</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
# 备份 MongoDB 数据：
mongodump --host $MONGODB_IP -u $MONGODB_USER -p $MONGODB_PASS --oplog --gzip --out /data/mongodb_bak</code></pre>


<ul>
<li>停止 MongoDB</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcec stop mongodb</code></pre>


<ul>
<li>备份 MongoDB 数据目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

for ip in ${MONGODB_IP[@]}; do
    backup_dir=/data/mongodb_dirbak_$(date +%F);
    rcmd root@&quot;$ip&quot; &quot;if ! [[ -d $backup_dir ]];then mkdir $backup_dir;fi; tar czfP $backup_dir/mongodb.tar.gz $INSTALL_PATH/public/mongodb/&quot;;
done</code></pre>


<ul>
<li>拉起 MongoDB 服务</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcec start mongodb</code></pre>


<h3 id="zookeeper">备份 Zookeeper</h3>
<ul>
<li>备份 Zookeeper 数据目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">for ip in ${ZK_IP[@]};do
    backup_dir=/data/zk_dirbak_$(date +%F);
    rcmd root@&quot;$ip&quot; &quot;if ! [[ -d $backup_dir ]];then mkdir $backup_dir;fi; tar czfP $backup_dir/zk.tar.gz $INSTALL_PATH/public/zk/&quot;;
done</code></pre>


<h3 id="rabbitmq">备份 Rabbitmq</h3>
<ul>
<li>备份 Rabbitmq 数据目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">for ip in ${RABBITMQ_IP[@]}; do
    backup_dir=/data/rabbitmq_dirbak_$(date +%F);
    ssh root@&quot;$ip&quot; &quot;if ! [[ -d $backup_dir ]];then mkdir $backup_dir;fi; tar czfP $backup_dir/rabbitmq.tar.gz $INSTALL_PATH/public/rabbitmq/&quot;;
done</code></pre>


<h3 id="src">备份 src 目录</h3>
<pre class="codehilite"><code class="language-bash"># 中控机执行，请用 mv 备份 src 目录。
mv /data/src/ /data/src.bak</code></pre>


<h3 id="install">备份 install 目录</h3>
<pre class="codehilite"><code class="language-bash"># 请不要使用 mv 命令备份，一定要使用 cp 备份 install 目录，不然会导致 install/.app.token发生改变
cp -a /data/install /data/install.bak</code></pre>


<h3 id="python">备份 Python 解释器</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
for i in ${ALL_IP[@]};do ssh $i 'for py in py27 py27_e py36 py36_e; do [[ -d /opt/$py ]] &amp;&amp; mv /opt/$py /opt/&quot;$py&quot;_bak; done'; done</code></pre>


<h3 id="_14">备份模块分布标记文件</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
for i in ${ALL_IP[@]};do ssh $i 'mv /data/bkce/.installed_module /data/bkce/.installed_module.bak'; done</code></pre>


<h3 id="_15">备份模块安装标记文件</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
for i in ${ALL_IP[@]};do ssh $i 'mv /data/install/.bk_install.step /data/install/.bk_install.step.bak'; done</code></pre>


<h2 id="_16">更新软件包及相关文件</h2>
<h3 id="v60">更新 V6.0 软件包</h3>
<pre class="codehilite"><code class="language-bash">tar xvf bkce_src-6.0.4.tgz -C /data</code></pre>


<h3 id="_17">解压各个产品包</h3>
<pre class="codehilite"><code class="language-bash">cd /data/src/; for f in *gz;do tar xf $f; done</code></pre>


<h3 id="rpm-opt">拷贝 rpm 包文件夹到/opt/目录</h3>
<pre class="codehilite"><code class="language-bash">cp -a /data/src/yum /opt</code></pre>


<h3 id="_18">恢复环境变量文件</h3>
<pre class="codehilite"><code class="language-bash">cp /tmp/install/bin/01-generate/* /data/install/bin/01-generate/
cp /tmp/install/bin/03-userdef/* /data/install/bin/03-userdef/</code></pre>


<h3 id="installconfig">更新 install.config 配置</h3>
<p>请参考 <a href="./update_install_config_for_v6.md">社区版 5.1-6.0 install.config 配置</a></p>
<h3 id="_19">主机免密</h3>
<p><font color="#dd0000">仅新增主机升级需要操作。</font></p>
<pre class="codehilite"><code class="language-bash">./configure_ssh_without_pass</code></pre>


<h3 id="_20">恢复证书</h3>
<ul>
<li>如原 license 模块分布未发生改变，请按下述步骤操作：</li>
</ul>
<pre class="codehilite"><code class="language-bash">cp -a /data/src.bak/cert /data/src/</code></pre>


<ul>
<li>如原 license 模块分布发生改变，请按下述步骤操作：</li>
</ul>
<p>请前往 <a href="https://bk.tencent.com/download_ssl/">蓝鲸官网</a> 重新生成证书。将生成的证书包上传至中控机 /data 目录</p>
<pre class="codehilite"><code class="language-bash">install -d -m 755 /data/src/cert
tar xf /data/ssl_certificates.tar.gz -C /data/src/cert/</code></pre>


<h3 id="_21">初始化操作</h3>
<p>生成蓝鲸部署时所需的环境变量以及资源。</p>
<pre class="codehilite"><code class="language-bash">./bk_install common</code></pre>


<h3 id="_22">初始化资源检查</h3>
<pre class="codehilite"><code class="language-bash">cd /data/install
./health_check/check_bk_controller.sh</code></pre>


<h2 id="_23">开源组件升级</h2>
<h3 id="consul">升级 consul</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install consul &amp;&amp; echo &quot;install consul&quot; &gt;&gt; /data/install/.bk_install.step
./bkcli start consul &amp;&amp; echo &quot;start consul&quot; &gt;&gt; /data/install/.bk_install.step</code></pre>


<h3 id="mysql_1">升级 MySQL</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install mysql &amp;&amp; echo &quot;install mysql&quot; &gt;&gt;/data/install/.bk_install.step
./bkcli start mysql &amp;&amp; echo &quot;start mysql&quot; &gt;&gt;/data/install/.bk_install.step</code></pre>


<h4 id="mysql_2">恢复 MySQL 数据</h4>
<pre class="codehilite"><code class="language-bash"># 登录至 MySQL 机器
source /data/install/utils.fc
ssh $BK_MYSQL_IP

# 恢复数据
mysql --login-path=default-root --default-character-set=utf8  &lt; /data/dbbak/bk_mysql_alldata.sql</code></pre>


<h3 id="mongodb_1">升级 MongoDB</h3>
<p>参考 <a href="./update_mongodb_for_v6.md">蓝鲸社区版 5.1 mongodb 升级文档</a></p>
<h3 id="rabbitmq_1">解决 Rabbitmq 依赖冲突</h3>
<pre class="codehilite"><code class="language-bash"># 卸载之前的依赖
./pcmd.sh -H $BK_RABBITMQ_IP &quot;yum -y remove rabbitmq-server.noarch  erlang-*&quot;</code></pre>


<h3 id="kafka">升级 Kafka</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install kafka  &amp;&amp; echo &quot;install kafka&quot; &gt;&gt; /data/install/.bk_install.step</code></pre>


<p><font color="#dd0000">新增机器请忽略该步骤</font></p>
<p>由于 Kafka 版本原因，以及由原来的集群变为单点。所以配置文件中的 <code>broker.id</code> 会有所变化，在启动 Kafka 时会报错。所以需要先做如下修改，修改后再启动 kafka :</p>
<pre class="codehilite"><code class="language-bash"># 登录至 Kafka 机器
source /data/install/utils.fc
ssh $BK_KAFKA_IP

# 查看升级 Kafka 后的 server.properties 文件中的 broker.id。将 meta.properties 中的 broker.id 与 server.properties文件中的保持一致
# x 为实际的 broker.id
grep &quot;broker.id&quot; /data/bkce/public/kafka/meta.properties
broker.id=x

# 替换 server.properties 中的 broker.id 。 请将下述的 x 替换成实际的值
sed -i &quot;s/broker.id=.*/broker.id=x/g&quot; /etc/kafka/server.properties

# 修改 kakfa 数据目录属组属主
chown -R kafka.kafka /data/bkce/public/kafka</code></pre>


<h2 id="_24">升级蓝鲸组件</h2>
<h3 id="paas">升级 PaaS 平台</h3>
<p><strong>注意：</strong> 确定所有的 SaaS 已下线</p>
<ul>
<li>升级前需先生成前置 SQL 文件，并将该 SQL 文件导入指定数据库。</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 生成前置 SQL 文件
cat &gt; /data/change_paas.sql &lt;&lt;EOF
use open_paas;
insert into django_migrations(app, name, applied) value('bkcore', '0010_auto_20171110_1004', Now());
insert into django_migrations(app, name, applied) value('bkcore', '0011_auto_20171116_1205', Now());
insert into django_migrations(app, name, applied) value('bkcore', '0012_auto_20180622_1815', Now());
insert into django_migrations(app, name, applied) value('home', '0004_auto_20200714_1627', Now());
delete from auth_permission where content_type_id in (select id from django_content_type where app_label='app' and model='desktopsettings');
delete from django_content_type where app_label='app' and model='desktopsettings';
EOF</code></pre>


<ul>
<li>导入 SQL 文件并验证</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 导入 SQL 文件
mysql --login-path=mysql-default &lt; /data/change_paas.sql

# 查询验证
mysql --login-path=mysql-default  -e &quot;use open_paas;select  app,name,applied from django_migrations where app='bkcore' order by name desc  limit 5;&quot;</code></pre>


<ul>
<li>由于 5.1 的 PaaS 是未加密版本，所以在升级的过程中，会出现加密的报错。需先删掉 PaaS 的旧虚拟环境后再升级 PaaS。</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

./pcmd.sh -H $BK_PAAS_IP &quot;rmvirtualenv open_paas-apigw open_paas-appengine open_paas-esb open_paas-login open_paas-paas&quot;</code></pre>


<ul>
<li>开始升级</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bk_install paas</code></pre>


<h3 id="app_mgr">升级 app_mgr</h3>
<pre class="codehilite"><code class="language-bash">./bk_install app_mgr</code></pre>


<h3 id="_25">部署权限中心和用户管理</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_iam
./bk_install saas-o bk_user_manage</code></pre>


<h4 id="_26">迁移用户管理数据</h4>
<blockquote>
<p>验证：执行完下述命令后，打开用户管理 -&gt; 组织架构 -&gt; 默认目录 -&gt; 总公司。检查原 5.1 上的用户是否存在。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash"># 登陆 usermgr 服务器，执行脚本
source /data/install/utils.fc
ssh $BK_USERMGR_IP

# 进入用户管理虚拟环境
workon usermgr-api

source /data/install/utils.fc
# 加载相关环境变量
export MYSQL_IP0=$BK_PAAS_MYSQL_HOST
export MYSQL_PORT=$BK_PAAS_MYSQL_PORT
export MYSQL_USER=$BK_PAAS_MYSQL_USER
export MYSQL_PASS=$BK_PAAS_MYSQL_PASSWORD
export DJANGO_SETTINGS_MODULE=config.ce.prod
export BK_FILE_PATH=&quot;/data/bkce/usermgr/cert/saas_priv.txt&quot;

# 迁移数据前，查看迁移内容
python manage.py migrate_from_ce_5dot1 --dry_run   # WARNING 输出为正常

# 迁移内容无误后，开始迁移
python manage.py migrate_from_ce_5dot1 &gt; migrate.log</code></pre>


<h3 id="cmdb">升级 CMDB</h3>
<pre class="codehilite"><code class="language-bash">./bk_install cmdb

# 授权原主机导入的 xlsx 目录
./pcmd.sh -m cmdb &quot;chown -R blueking.blueking /tmp/template&quot;</code></pre>


<h3 id="_27">升级作业平台</h3>
<pre class="codehilite"><code class="language-bash">./bk_install job</code></pre>


<h4 id="job">JOB 数据迁移</h4>
<ul>
<li>在执行 JOB 数据迁移时，请先执行如下命令，将 JOB 加入至权限中心白名单</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 添加白名单 （中控机执行）
mysql --login-path=mysql-default -e &quot;insert into bk_iam.authorization_authapiallowlistconfig(creator, updater, created_time, updated_time, type, system_id, object_id) value('', '', now(), now(), 'authorization_instance', 'bk_job', 'use_account');&quot;

# 确认是否已插入
mysql --login-path=mysql-default -e &quot;select * from bk_iam.authorization_authapiallowlistconfig where type='authorization_instance' and system_id='bk_job'&quot;</code></pre>


<ul>
<li>
<p>开始迁移</p>
<p>下载迁移工具：job-migration-ce_0.1.2_Linux_x86_64.tar.gz</p>
<p>```bash</p>
<h1 id="readmemd">请按照仔细阅读目录下 README.md 文档</h1>
<p>tar -xvf /data/job-migration-ce_0.1.2_Linux_x86_64.tar.gz -C /data
cd /data/job-migration-ce_0.1.2_Linux_x86_64
```</p>
<ul>
<li>加载环境变量</li>
</ul>
<p><code>bash
source /data/install/utils.fc</code></p>
<ul>
<li>生成 config.toml 文件。<code>生成后请检查该文件内的相关变量是否转化成具体的值。</code></li>
</ul>
<p>```bash
cat &gt; config.toml &lt;&lt; EOF
jobManageHost = "http://$BK_JOB_IP:$BK_JOB_MANAGE_SERVER_PORT"
jobCrontabHost = "http://$BK_JOB_IP:$BK_JOB_CRONTAB_SERVER_PORT"
processScript = true
processPlan = true
processCron = true
processWhiteList = true
offset = 0
includeAppId = ""
excludeAppId = ""
test = false</p>
<h1 id="id-11">如果不需要更改业务 ID 则可以去掉。配置成 1=1 也不影响</h1>
<p>[appMapper]
1 = 1</p>
<p>[mysql]
host = "$BK_MYSQL_IP"
port = 3306
username = "$BK_MYSQL_ADMIN_USER"
password = "$BK_MYSQL_ADMIN_PASSWORD"
database = "job"</p>
<p>[log]
level = "info"</p>
<p>[jwt]
RSAPublicKey = "$BK_JOB_SECURITY_PUBLIC_KEY_BASE64"</p>
<p>RSAPrivateKey = "$BK_JOB_SECURITY_PRIVATE_KEY_BASE64"</p>
<p>EOF
```</p>
<ul>
<li>迁移 JOB 脚本数据</li>
</ul>
<p><code>bash
./job-migration-ce</code></p>
</li>
</ul>
<h4 id="job_1">JOB 帐号迁移</h4>
<p>下载迁移工具：job-account-perm-migration_v0.0.0-next_Linux_x86_64.tar.gz</p>
<pre class="codehilite"><code class="language-bash"># 请按照仔细阅读目录下 README.md 文档
tar -xvf /data/job-account-perm-migration_v0.0.0-next_Linux_x86_64.tar.gz -C /data/
cd /data/job-account-perm-migration_v0.0.0-next_Linux_x86_64</code></pre>


<ul>
<li>加载环境变量</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc</code></pre>


<ul>
<li>生成 config.toml 文件。 <code>生成后请检查该文件内的相关变量是否转化成具体的值。</code></li>
</ul>
<pre class="codehilite"><code class="language-bash">cat &gt; config.toml &lt;&lt; EOF

jobGatewayHost = &quot;http://$BK_JOB_GATEWAY_HTTP_PRIVATE_ADDR&quot;
esbHost = &quot;http://$BK_PAAS_PRIVATE_ADDR&quot;
includeAppId = &quot;&quot;
excludeAppId = &quot;&quot;
appCode = &quot;$BK_JOB_APP_CODE&quot;
appSecret = &quot;$BK_JOB_APP_SECRET&quot;
iamHost = &quot;$BK_IAM_PRIVATE_URL&quot;

[appMapper]

[mysql]
host = &quot;$BK_MYSQL_IP0&quot;
port = 3306
username = &quot;$BK_MYSQL_ADMIN_USER&quot;
password = &quot;$BK_MYSQL_ADMIN_PASSWORD&quot;
database = &quot;job&quot;

[log]
level = &quot;info&quot;
EOF</code></pre>


<ul>
<li>执行升级脚本</li>
</ul>
<pre class="codehilite"><code class="language-bash">./job-account-perm-migration</code></pre>


<h4 id="job_2">迁移 JOB 上传文件目录</h4>
<pre class="codehilite"><code class="language-bash"># 这里以默认的 /data/bkce/ 目录为例，升级过程请以实际的为准
source /data/install/utils.fc
ssh $BK_JOB_IP

cd /data/bkce/public/job/

# 如果未进行过文件分发，不会生成 localupload ，可手动创建
mkdir localupload
cp -a -r  data1/localupload/* localupload/
chown -R blueking.blueking /data/bkce/public/job/localupload/</code></pre>


<h3 id="_28">升级节点管理</h3>
<ul>
<li>如有涉及到 proxy 请参考 <a href="https://bk.tencent.com/docs/document/6.0/127/7917">开启 Proxy</a></li>
</ul>
<h4 id="_29">升级前置准备</h4>
<ul>
<li>同步节点管理文件</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcli sync nodeman</code></pre>


<ul>
<li>同步升级脚本文件</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机
cd /data/install
./sync.sh nodeman /data/upgrade.py /data/</code></pre>


<h5 id="_30">创建节点管理升级环境</h5>
<ul>
<li>登录到节点管理机器，创建升级所需目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/load_env.sh
ssh $BK_NODEMAN_IP

# 创建升级文件存放目录
mkdir /data/bkce/nodeman_update

# 将 upgrade.py 放置 /data/bkce/nodeman_update 目录下，假设原先该文件放置于 /data 目录
cp -a /data/upgrade.py /data/bkce/nodeman_update/</code></pre>


<ul>
<li>生成 requirements.txt 文件</li>
</ul>
<pre class="codehilite"><code class="language-bash">cat &gt; /data/bkce/nodeman_update/requirements.txt &lt;&lt; EOF
pymysql
requests
pycryptodome
pycryptodomex
EOF</code></pre>


<ul>
<li>创建节点管理升级虚拟环境目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">cd /data/install
./bin/install_py_venv_pkgs.sh -e -p /opt/py36/bin/python -n nodeman_update -a /data/bkce/nodeman_update -s /data/src/bknodeman/support-files/pkgs  -r /data/bkce/nodeman_update/requirements.txt</code></pre>


<ul>
<li>执行升级脚本</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
workon nodeman_update

# 注意：$NODEMAN_APP_CODE 和 $NODEMAN_APP_SECRET 是指节点管理 SaaS 的应用 ID 和应用 TOKEN。且此时的 SaaS 状态处于下线状态，需要将隐藏的 SaaS 显示才能找到节点管理的应用。
# 可以在 &quot;PaaS 平台 -&gt; 开发者中心 -&gt;  S-mart 应用 -&gt; 显示已下架应用 -&gt; 节点管理&quot; 进行查看，然后使用实际的值进行替换即可。

python upgrade.py -a $NODEMAN_APP_CODE  -s $NODEMAN_APP_SECRET -t $BK_MYSQL_IP0 -u $BK_NODEMAN_MYSQL_USER -p $BK_NODEMAN_MYSQL_PASSWORD -o $BK_NODEMAN_MYSQL_PORT</code></pre>


<h4 id="_31">开始升级</h4>
<pre class="codehilite"><code class="language-bash">./bk_install bknodeman</code></pre>


<ul>
<li>迁移 SaaS 数据：</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 登陆至 APPO 机器
source /data/install/utils.fc
ssh $BK_APPO_IP

# 进入节点管理容器内
docker exec -it $(docker ps |awk '/bk_nodeman/{print $1}') /bin/bash

# 开始数据迁移。
export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;
/cache/.bk/env/bin/python /data/app/code/manage.py sync_cmdb_cloud_area
/cache/.bk/env/bin/python /data/app/code/manage.py sync_cmdb_host
/cache/.bk/env/bin/python /data/app/code/manage.py sync_agent_status
/cache/.bk/env/bin/python /data/app/code/manage.py sync_plugin_status</code></pre>


<h3 id="_32">监控平台</h3>
<h4 id="_33">升级监控平台</h4>
<pre class="codehilite"><code class="language-bash">./bk_install bkmonitorv3</code></pre>


<h4 id="_34">监控配置迁移</h4>
<p><strong>注意：</strong> 不支持原 5.1 的组件监控迁移。</p>
<p>监控平台部署完成后，请登录蓝鲸监控平台，进入到监控平台 Web 页面，在左侧导航栏中找到【配置升级】然后开始数据迁移</p>
<ul>
<li>迁移步骤：</li>
<li>点击开始迁移。</li>
<li>选择迁移的内容后，点击开始迁移，然后查看迁移状态。</li>
<li>迁移完成后，会存在相同的监控策略，为避免重复告警，请停用旧的监控策略。</li>
</ul>
<p><img alt="bkmonitorv3" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/update_bkmonitorv3.png" /></p>
<h3 id="_35">日志平台</h3>
<p><strong>日志平台迁移后，只是将原采集配置任务迁移，需要手动重新下发任务才能生效，请知悉。</strong></p>
<h4 id="_36">支持&amp;不支持迁移的内容</h4>
<ul>
<li>迁移内容</li>
<li>支持迁移</li>
<li>采集配置项数据<ul>
<li>迁移的字段：<code>采集 IP</code>，<code>采集路径</code>。不支持迁移 <code>排除文件类型</code> 和 <code>过期时间</code></li>
<li>迁移后为草稿状态，此时未下发采集配置。需要点击保存方可下发配置</li>
</ul>
</li>
<li>不支持迁移</li>
<li>ES数据</li>
<li>监控策略</li>
<li>
<p>角色权限</p>
</li>
<li>
<p>升级日志平台</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bk_install bklog</code></pre>


<ul>
<li>执行变更脚本</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 在 APPO 机器执行以下命令
source /data/install/utils.fc
ssh $BK_APPO_IP

# 进入 bk_log_search 的 docker 容器
docker exec -it $(docker ps |awk '/bk_log_search/{print $1}') /bin/bash

# 进入容器后，修改语言配置、进入工作目录
export LC_ALL=en_US.UTF-8
cd /data/app/code

# 查看升级用户名单（仅展示但不执行，用于做确认）
# bk_biz_id 可选，不提供则代表全业务
export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;
/cache/.bk/env/bin/python manage.py iam_list_upgrade [bk_biz_id]

# 执行升级，向权限中心同步操作权限
# bk_biz_id 可选，不提供则代表全业务
/cache/.bk/env/bin/python manage.py iam_do_upgrade [bk_biz_id]

# 执行配置迁移
/cache/.bk/env/bin/python manage.py migrate_v2_config</code></pre>


<h3 id="_37">升级故障自愈</h3>
<ul>
<li>升级故障自愈之前，需要对原来的日志目录权限做下修改，6.0 之前的启动用户是 root，在启动故障自愈时会出现权限问题，所以需要将原来的属主属组修改成 blueking。<font color="#dd0000">新增机器请忽略该步骤</font></li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机执行
./pcmd.sh -H $BK_FTA_IP  &quot;chown -R blueking.blueking $BK_HOME/logs/fta/&quot;</code></pre>


<ul>
<li>开始升级</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bk_install fta</code></pre>


<h3 id="_38">升级标准运维</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_sops

# # 在 APPO 机器执行以下命令
source /data/install/utils.fc
ssh $BK_APPO_IP

# 进入 bk_sops 的 docker 容器
docker exec -it $(docker ps |awk '/bk_sops/{print $1}') /bin/bash

export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;
cd /data/app/code &amp;&amp; python manage.py task_model_migrate</code></pre>


<h3 id="_39">流程服务</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_itsm</code></pre>


<h3 id="_40">权限中心同步用户组织架构</h3>
<p>同步用户管理数据，确保是最新的组织架构数据</p>
<blockquote>
<p>依赖 IAM V3 后台服务、IAM V3 SaaS、用户管理 和 PaaS（ESB）、必须保证需要迁移权限的系统，对应权限模型已注册</p>
</blockquote>
<pre class="codehilite"><code class="language-bash"># 登陆至 APPO 机器
source /data/install/utils.fc
ssh $BK_APPO_IP

# 进入 iam 容器内
docker exec -it $(docker ps | grep -Fw bk_iam | awk '{print $1}') bash

# 同步架构数据
export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;
/cache/.bk/env/bin/python /data/app/code/manage.py shell

from backend.apps.organization.tasks import sync_organization
sync_organization()</code></pre>


<h3 id="_41">迁移权限中心数据</h3>
<ul>
<li>将权限中心的升级包下载至中控机的 <code>/data</code> 目录后解压</li>
</ul>
<pre class="codehilite"><code class="language-bash">tar -xvf /data/iam_v3_legacy_1.0.16_for_ce.tgz -C /data
cd /data/iam_v3_legacy_1.0.16_for_ce</code></pre>


<ul>
<li>执行 v3 相关权限数据导出到文件</li>
</ul>
<pre class="codehilite"><code class="language-bash">bash mysqldump_bk_iam_data.sh -d bk_iam -p $BK_MYSQL_ADMIN_PASSWORD -P 3306 -b $BK_MYSQL_IP0</code></pre>


<ul>
<li>执行导出配置业务和标准运维项目数据到 CSV 文件</li>
</ul>
<pre class="codehilite"><code class="language-bash">bash ./edition/mysqldump_bk_sops_data.sh -d bk_sops -p $BK_MYSQL_ADMIN_PASSWORD -P 3306 -b $BK_MYSQL_IP0

/opt/py27/bin/python -m edition.dump_biz_data -s $BK_IAM_APP_SECRET &lt;iam SaaS 的 app secret，可由页面获取&gt;  -t $BK_PAAS_PRIVATE_ADDR</code></pre>


<h3 id="_42">创建对应业务运维组</h3>
<p><strong>在升级的过程中，默认只创建对应业务下的运维组，如之前涉及的开发、测试等角色人员，需自行创建对应的用户组。</strong></p>
<blockquote>
<p>验证：执行完下述命令后，打开权限中心 -&gt; 右上角切换身份至超级管理 -&gt; 用户组。查看是否建立了对应业务的用户组。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">/opt/py27/bin/python -m edition.migrate_biz_group -s $BK_IAM_APP_SECRET &lt;iam SaaS的app secret，可由页面获取&gt;  -t $BK_PAAS_PRIVATE_ADDR</code></pre>


<h3 id="_43">创建对应业务运维模板</h3>
<p><strong>在升级的过程中，默认只创建对应业务下的运维模板，如之前涉及的开发、测试等角色人员，需自行创建对应的模板。</strong></p>
<ul>
<li>创建 CMDB 的业务模板</li>
</ul>
<blockquote>
<p>验证：执行完下述命令后，打开权限中心 -&gt;  右上角切换身份至超级管理 -&gt; 权限模版。查看是都建立对对应业务的配置平台运维模版。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">/opt/py27/bin/python -m edition.migrate_biz_policy -s $BK_IAM_APP_SECRET &lt;iam SaaS 的 app secret，可由页面获取&gt;  -t $BK_PAAS_PRIVATE_ADDR -e bk_cmdb -E ce -f &lt;配置平台空闲机目录 ID，获取方式请往下看&gt;</code></pre>


<p><strong>配置平台空闲机目录 ID 查询方式：</strong></p>
<pre class="codehilite"><code class="language-bash"># 登陆至 mongodb 机器
source /data/install/utils.fc
ssh $BK_MONGODB_IP

# 登陆 MongoDB 查询
source /data/install/utils.fc
mongo -u $BK_MONGODB_ADMIN_USER -p $BK_MONGODB_ADMIN_PASSWORD mongodb://$BK_MONGODB_IP:27017/admin?replicaSet=rs0


# &quot;bk_module_id&quot; : NumberLong(1) 中的 1 即为配置平台空闲机目录ID
use cmdb
db.cc_ModuleBase.find({default: 1, bk_biz_id: db.cc_ApplicationBase.findOne({default:1, bk_supplier_account:&quot;0&quot;}).bk_biz_id},{bk_module_id:1,bk_module_name:1,_id:0}).pretty()</code></pre>


<ul>
<li>创建 JOB、节点管理、监控平台、日志平台、标准运维权限模板</li>
</ul>
<pre class="codehilite"><code class="language-bash"># bk_iam_app_secret 中的值请使用实际的值替换。可由页面获取权限中心 SaaS 的 应用 TOKEN

bk_iam_app_secret=&quot;xxxxxxxx&quot;
modules=(bk_job bk_nodeman bk_monitorv3 bk_log_search bk_sops)

for module in ${modules[@]}
do
    /opt/py27/bin/python -m edition.migrate_biz_policy -s ${bk_iam_app_secret} -t $BK_PAAS_PRIVATE_ADDR -e ${module} -E ce
done</code></pre>


<h2 id="_44">蓝鲸业务拓扑升级</h2>
<p>从 5.1 升级到 6.0 后，如果没有对原拓扑进行升级，蓝鲸监控会出现端口或者进程不存在的告警。<strong>&lt;该类告警可忽略&gt;</strong></p>
<p>升级请见 ：<a href="./update_bktopo_for_v6.md">社区版 5.1-6.0 蓝鲸业务拓扑升级</a></p><h1 id="lesscode">可视化开发平台（lesscode）安装指引</h1>
<h2 id="_1">使用范围</h2>
<p>6.0.4 之前版本（不含 6.0.4 ，6.0.4 基础套餐默认包含）</p>
<h2 id="_2">说明</h2>
<ul>
<li>下述操作均在中控机操作，且所述路径均为蓝鲸默认路径，实际操作过程中，请以实际为准。</li>
<li>如果使用的是新机器进行部署可视化开发平台，请先根据 <a href="../../维护手册/日常维护/scale_node.md">新机器初始化</a> 进行操作。</li>
</ul>
<h2 id="_3">下载软件包</h2>
<h3 id="lesscode_1">下载 lesscode 软件包</h3>
<p>前往 <a href="https://bk.tencent.com/s-mart/market">蓝鲸 S-mart 市场</a> 下载 Lesscode 软件包。并将下载好的 lesscode 放置 /data 目录</p>
<pre class="codehilite"><code class="language-bash">tar xf /data/lesscode-ce-0.0.11.tar.gz -C /data/src/</code></pre>


<h3 id="lesscode_2">下载 lesscode 依赖包</h3>
<pre class="codehilite"><code class="language-bash">cd /data/src
wget https://nodejs.org/download/release/v14.17.0/node-v14.17.0-linux-x64.tar.gz</code></pre>


<h2 id="_4">分布模块</h2>
<p>将 lesscode 模块加入 install.config 文件</p>
<p>如基础环境主机资源有富余（lesscode 占用内存 150M 左右），可复用基础环境的机器，反之请按下述操作新增机器分布模块。</p>
<pre class="codehilite"><code class="language-bash"># 请以实际分布的 IP 为准
{
echo &quot;&quot;
echo &quot;10.0.0.6 lesscode&quot; 
} &gt;&gt; /data/install/install.config</code></pre>


<h2 id="lesscode_3">定义 lesscode 域名</h2>
<p><strong>注意：</strong> lesscode 的域名需要定义成与 PaaS 一致的根域名。</p>
<p>例如：PaaS 的域名为 <code>paas.bk.bktencent.com</code>，那么 lesscode 就需要为：<code>lesscode.bk.bktencent.com</code>。</p>
<pre class="codehilite"><code class="language-bash"># 以蓝鲸默认域名为例
{
echo &quot;BK_LESSCODE_PUBLIC_ADDR=lesscode.bktencent.com:80&quot;
echo &quot;BK_LESSCODE_PUBLIC_URL=http://lesscode.bktencent.com:80&quot;
} &gt;&gt; /data/install/bin/03-userdef/lesscode.env</code></pre>


<h2 id="_5">生成环境变量</h2>
<p>生成 lesscode 所需的环境变量</p>
<pre class="codehilite"><code class="language-bash">cd /data/install
./bkcli install bkenv

./bkcli sync common</code></pre>


<p><strong>说明：</strong> 如果是全新的机器需要做如下操作</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
pcmd -m lesscode &quot;bash /data/install/bin/init_new_node.sh&quot;</code></pre>


<h2 id="mysql">生成 MySQL 登陆信息</h2>
<pre class="codehilite"><code class="language-bash">./bkcli install mysql</code></pre>


<h2 id="lesscode_4">部署 lesscode</h2>
<pre class="codehilite"><code class="language-bash">./bk_install lesscode</code></pre>


<h2 id="lesscode_5">访问 lesscode</h2>
<ul>
<li>绑定本地 hosts</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 映射的 IP 为 nginx 所在机器的外网 IP
10.0.0.2 lesscode.bktencent.com</code></pre>


<p>完成 hosts 配置后，访问蓝鲸 PaaS 工作台即可看到【可视化开发平台】。</p><h1 id="_1">部署方案</h1>
<p>蓝鲸社区版，是蓝鲸智云提供面向社区用户基于 PaaS 的运维技术解决方案套件。</p>
<p>它永久免费，支持公有云环境、私有环境的独立搭建部署。</p>
<p>本文档主要介绍蓝鲸社区版的初次安装部署、日常维护、更新升级、故障排查等运维相关的内容。</p>
<p>关于蓝鲸各大平台、SaaS 应用的相关使用说明，请参考 <a href="https://bk.tencent.com/docs/">蓝鲸社区版产品白皮书</a>。</p>
<h2 id="_2">安装方案</h2>
<p>蓝鲸社区版基础包安装介质分为软件包 (src)和部署脚本包 (install)。</p>
<p>安装原理：通过 <code>rsync + ssh</code> ，将软件包里的各模块按需分发到指定机器，通过部署脚本安装软件依赖、自动生成配置文件、初始化数据库、配置账户和权限等，最后启动进程。</p>
<ul>
<li>
<p><a href="../基础包安装/软件包简介/src_overview.md">软件包简介</a></p>
</li>
<li>
<p><a href="../部署脚本/intro.md">部署脚本简介</a></p>
</li>
</ul>
<h2 id="_3">安装环境准备</h2>
<p>在开始安装前，请参照 <a href="../基础包安装/环境准备/get_ready.md">环境准备文档</a>，准备安装介质，配置系统环境。</p>
<h2 id="_4">安装方式</h2>
<p>社区版目前支持两种安装方式选择：</p>
<ul>
<li>
<p><strong>单机部署</strong>：对于首次接触蓝鲸的用户，寻找一个最快体验和评估蓝鲸的核心功能的方式，请参照 <a href="../基础包安装/单机部署/install_on_single_host.md">单机部署文档</a>，可以快速体验到蓝鲸基础平台的功能。</p>
</li>
<li>
<p><strong>标准部署</strong>：若需完整的社区版基础包功能，请参照 <a href="../基础包安装/多机部署/quick_install.md">标准部署文档</a> 进行安装。</p>
</li>
</ul>
<h2 id="_5">推荐安装流程</h2>
<p>推荐安装完基础包后，再部署安装增强包。</p><h1 id="_1">术语解释</h1>
<p><strong>PaaS：</strong> 平台即服务，本文特指蓝鲸的 PaaS 平台。</p>
<p><strong>IAM：</strong> 蓝鲸权限中心。</p>
<p><strong>USERMGR：</strong> 蓝鲸用户管理。</p>
<p><strong>JOB：</strong> 蓝鲸作业平台。</p>
<p><strong>CMDB：</strong> 蓝鲸配置平台。</p>
<p><strong>FTA：</strong> 蓝鲸故障自愈后台。</p>
<p><strong>BKMONITORV3：</strong> 蓝鲸监控平台后台。</p>
<p><strong>BKLOG：</strong> 蓝鲸日志平台后台。</p>
<p><strong>BKNODEMAN：</strong> 蓝鲸节点管理后台。</p>
<p><strong>SaaS：</strong> 软件即服务，本文特指 S-mart 市场下载的应用。</p>
<p><strong>S-mart 市场：</strong> 蓝鲸的应用生态市场。</p>
<p><strong>GSE (General Service Engine)：</strong> 管控平台。</p>
<p><strong>中控机：</strong> 安装蓝鲸的主机，选择一台作为执行安装命令的机器，它通过 ssh 免密登录操作其余机器。(安装后查看中控机方式：cat /data/install/.controller_ip)</p><h1 id="_1">蓝鲸后台模块简介</h1>
<p>部署、配置、维护蓝鲸，管理员需要理解蓝鲸的后台模块。</p>
<p>正如在蓝鲸的<a href="https://bk.tencent.com/static/images/product/framework_ce_zh.png">产品功能架构图</a>所示。整套蓝鲸由 PaaS 平台、多个原子平台和上层 SaaS 应用组成。</p>
<p>本文简要介绍这些平台和 SaaS 的架构。</p>
<h2 id="paas">PaaS 平台</h2>
<p>首先需要了解 PaaS 平台及配套的用户管理和认证平台。</p>
<p>PaaS 平台包含：</p>
<ul>
<li>paas 后台模块，它包含五个子工程，社区版部署为了简化，均部署在同一台机器上，简称 paas 模块。</li>
<li>appengine</li>
<li>paas</li>
<li>esb</li>
<li>login</li>
<li>apigw</li>
<li>paas_agent 模块，根据环境分为测试环境(appt)和正式环境(appo)，它的功能是和 paas 后台交互，处理 SaaS 部署相关逻辑。</li>
</ul>
<p>PaaS 平台依赖 MySQL 存储应用数据、Redis 做缓存、Nginx 做接入层。</p>
<p>用户管理和认证平台包含：</p>
<p>后台模块：</p>
<ul>
<li>iam: 权限中心后台</li>
<li>ssm: 凭证管理后台，蓝盾和容器管理平台部署依赖。</li>
<li>usermgr: 用户管理后台</li>
</ul>
<p>前台 SaaS：</p>
<ul>
<li>bk_user_manage: 用户管理 SaaS</li>
<li>bk_iam: 权限中心 SaaS</li>
</ul>
<h2 id="_2">配置平台</h2>
<p>配置平台（以下简称 cmdb）包含十几个微服务进程，具体的架构参考：<a href="https://github.com/Tencent/bk-cmdb/blob/master/docs/overview/architecture.md">蓝鲸配置平台的架构设计</a></p>
<p>配置平台对外通过 <code>cmdb_apiserver</code> 提供 HTTP 协议接口接入到 PaaS 平台的 esb 总线对外提供访问。</p>
<p>内部微服务之间，通过 <code>zookeeper</code> 服务进行服务发现。数据库依赖 <code>MongoDB</code> 4.2 及以上版本。</p>
<h2 id="_3">管控平台</h2>
<p>管控平台（以下简称 gse）包含 8 个后台服务进程和远端管控机器上部署的 agent 进程，提供蓝鲸平台的文件传输能力、实时任务执行能力、数据采集与传输的能力</p>
<p>gse 的具体架构参考：<a href="https://bk.tencent.com/docs/document/6.0/143/6481">GSE 产品架构图</a></p>
<p>从运维关注的进程脚本，每个后台进程的功能描述如下：</p>
<ul>
<li>gse_api: 对外提供 api 的服务程序，查询 agent 状态信息等。</li>
<li>gse_task(TaskServer): 任务及控制服务端程序。该程序提供对集群内 Agent 的管理能力，并支持对 Agent 批量下和执行发命令或脚本</li>
<li>gse_data(DataServer): 数据传输服务端程序。该程序主要提供对 Agent 采集的数据进行汇聚、分类、流转能力</li>
<li>gse_btsvr(FileServer): 文件传输控制服务端程序。该程序对指定范围内 Agent 节点提供 BT 种子服务</li>
<li>gse_dba: Redis 集群管理模块。通过代理对 Redis 的操作，完成 Redis 分布式集群的同一管控，支持 hash 写入，多备份写入等</li>
<li>gse_procmgr: 进程管理服务程序。提供进程注册、操作、查询等原子操作，是节点管理的插件管理功能的后台程序之一</li>
<li>gse_syncdata: 数据同步服务程序。该服务支持订阅并同步配置平台的主机身份信息到远端 Agent</li>
<li>gse_alarm: Agent 状态监控程序。该程序会将心跳超时的 Agent 列表发给 gse_data</li>
</ul>
<p>gse 后台在部署上，需要注意的是，gse_dba 必须和 Redis 同机部署。</p>
<p>gse 的客户端称为 gse_agent，gse_agent 的安装部署，通过节点管理实施。</p>
<h2 id="_4">作业平台</h2>
<p>作业平台（以下简称 job），包含 6 个由 Sprint Cloud 框架开发的微服务。提供脚本执行，文件分发，和流程编排的能力。</p>
<p>作业平台依赖 GSE 提供的任务接口(gse_task)以及 cmdb 提供的拓扑和主机查询接口。</p>
<p>job 后台的 6 个进程，均为 java 进程，为了区分，使用定义的 systemd service 服务名如下：</p>
<ul>
<li>bk-job-config.service:    配置中心</li>
<li>bk-job-gateway.service:   业务网关</li>
<li>bk-job-manage.service:    作业管理</li>
<li>bk-job-execute.service:   作业执行，作业历史</li>
<li>bk-job-crontab.service:   定时任务管理和调度</li>
<li>bk-job-logsvr.service:    作业执行日志存取</li>
</ul>
<p>Job 后台进程之间通过 Consul 服务发现。通过 RabbitMQ 收发消息。Redis 做数据缓存。Mysql 存储作业相关信息。MongoDB 存储执行日志。</p>
<h2 id="_5">节点管理</h2>
<p>节点管理分为 SaaS(bk_nodeman) 和后台(bknodeman)。它主要功能是对 gse_agent 及其插件的安装升级卸载整个生命周期进行管理。</p>
<h2 id="_6">监控平台</h2>
<p>监控平台分为 SaaS(bk_monitorv3)和后台(bkmonitorv3)。</p>
<p>后台(bkmonitorv3)分为四个子工程：</p>
<ul>
<li>monitor: 监控后台，提供 api 接入 esb，供前端 SaaS 查询</li>
<li>transfer: 原始数据清洗入库进程</li>
<li>influxdb-proxy: InfluxDB 的读写代理，高可用部署方案依赖</li>
<li>grafana: 监控仪表盘的后台</li>
</ul>
<h2 id="_7">日志平台</h2>
<p>日志平台分为 SaaS(bk_log_search)和后台(bklog)</p><h1 id="_1">机器评估</h1>
<p>对于蓝鲸部署所需的硬件配置选型，并无规定。</p>
<p>蓝鲸由众多开源组件和自研组件构成。</p>
<p>开源组件的硬件选型可以参考相应的官方文档。</p>
<p>蓝鲸产品本身的建议配置如下：</p>
<table>
<thead>
<tr>
<th align="center">名称</th>
<th align="center">配置</th>
</tr>
</thead>
<tbody>
<tr>
<td align="center">操作系统</td>
<td align="center">CentOS 7.6</td>
</tr>
<tr>
<td align="center">体验功能</td>
<td align="center">4 核 8 G，硬盘 100G 以上</td>
</tr>
<tr>
<td align="center">生产环境</td>
<td align="center">4 核 16 G，硬盘 100G 以上（可根据实际情况适当调整配置）</td>
</tr>
<tr>
<td align="center">机器数量</td>
<td align="center">3 台</td>
</tr>
</tbody>
</table>
<p>如果硬件资源富余，可以一开始拆分搭建部署。若硬件资源不足，一开始可以混合搭建，注意观测资源消耗情况，可以适时增加机器，迁移模块的方式来保证整体的可用性。</p>
<p>资源规划是一个复杂的、动态的过程，更像是一门艺术而不是科学。</p>
<p>这里给出的一个比较合理的初始配置，基于以下考虑：</p>
<p>1. 分布式模块达到高可用至少三个节点，所以至少需要三个 OS (物理机或虚拟机均可)。</p>
<p>2. 若日志检索，蓝鲸监控是主要使用场景，请给 influxdb 和 elasticsearch 模块更多的内存，更好磁盘性能。如 SSD。</p>
<p>3. Nginx 模块所在的机器需要有对外提供服务，可访问的 IP。这是蓝鲸平台的总入口。</p>
<p>4. 如果需要有跨云管理需求，GSE 部署的机器需要有跨云的网络条件。</p><h1 id="_1">软件包简介</h1>
<p>解压 <code>bkce_basic_suite-6.0.3.tgz</code> 安装包后，<code>src</code> 即为软件包目录，存放了蓝鲸基础平台、官方 SaaS 包、开源组件等内容，<code>install</code> 则为蓝鲸部署脚本。</p>
<h2 id="_2">软件包目录结构</h2>
<p>请按照目录结构检查对应文件目录是否存在，版本号会随着每次更新而变更，请以官网下载的实际版本号为准：</p>
<h3 id="_3">基础套餐</h3>
<pre class="codehilite"><code class="language-bash">[root@VM-0-1 src]# pwd
/data/src
[root@VM-0-1 src]# tree -F -L 1
.
├── bkiam_ce-1.6.1.tgz
├── bknodeman_ce-2.0.723-bkofficial.tgz
├── bkssm_ce-1.0.8.tgz
├── blueking.env
├── cmdb_ce-3.9.22.tgz
├── COMMON_VERSION
├── gse_ce-3.5.16.tgz
├── gse_plugins/
├── image/
├── java8.tgz
├── job_ce-3.2.5.7.tgz
├── license_ce-3.1.5.tgz
├── MD5
├── official_saas/
├── open_paas_ce-2.12.8-bkofficial.tgz
├── paas_agent_ce-3.2.2.tgz
├── python/
├── usermgr_ce-2.2.5-bkofficial.tar.gz
├── VERSION
└── yum/</code></pre>


<h3 id="_4">增强套餐</h3>
<p>解压 bkce_co_suite-6.0.3-preview.tgz 安装包后，包含的是各产品的监控平台、日志平台和故障自愈的整包，以及各产品部署的标准运维流程模版。</p>
<h3 id="_5">增强软件包目录结构</h3>
<p><code>*.tgz</code> 为产品安装包。包含了自身产品的 <strong>后台包</strong> 以及 <strong>SaaS 包</strong>。
<code>*.dat</code> 为标准运维流程模版格式。名称组成：产品名称 + common_flow + 时间戳.dat</p>
<pre class="codehilite"><code class="language-bash">[root@VM-1-1-centos ~]# tar tvf bkce_co_suite-6.0.3-preview.tgz
-rw-r--r-- root/root     30416 2021-03-18 09:50 bklog_common_flow_20210318094934.dat
-rw-r--r-- root/root     31812 2021-03-18 09:50 bkmonitorv3_common_flow_20210318094947.dat
-rw-r--r-- root/root     30500 2021-03-18 09:50 fta_common_flow_20210318094919.dat
-rw-r--r-- root/root 147750238 2021-03-17 21:05 bklog_suite-4.2.556.tgz
-rw-r--r-- root/root 329022244 2021-03-17 21:05 bkmonitorv3_suite-3.3.1660.tgz
-rw-r--r-- root/root  69477999 2021-03-17 21:05 fta_suite-5.2.14-ce.tgz</code></pre>


<p>这里重点说明各产品下的 <code>support-files/</code> 目录，以权限中心的为例：</p>
<ul>
<li><strong>bkiam</strong>: 存放初始化权限文件。</li>
<li><strong>pkgs</strong>： 存放依赖包，比如 Python 工程的 pip 包。</li>
<li><strong>sql</strong>： 存放初始化或升级时用到的 sql 文件。</li>
<li><strong>templates</strong>： 存放模块的模板文件，安装时会替换里面的 类似 <code>__VAR_NAME__</code>： 形式的变量。</li>
</ul>
<h2 id="_6">软件包内容说明</h2>
<p>蓝鲸基础平台及 SaaS 详细说明请参考 <a href="https://bk.tencent.com/docs/">产品白皮书</a>，开源组件版本和配置方式可参考版本日志。</p>
<ul>
<li><strong>bkiam：</strong> 权限中心后台</li>
<li><strong>bklog：</strong> 日志平台后台</li>
<li><strong>bkmonitorv3：</strong> 监控平台后台</li>
<li><strong>bknodeman：</strong> 节点管理后台</li>
<li><strong>bkssm：</strong> 凭证管理后台</li>
<li><strong>blueking.env：</strong> 证书环境变量</li>
<li><strong>cert：</strong> 证书文件目录</li>
<li><strong>cmdb：</strong> 配置平台后台</li>
<li><strong>COMMON_VERSION：</strong> 开源组件包版本号</li>
<li><strong>fta：</strong> 故障自愈后台</li>
<li><strong>gse：</strong> 管控平台后台</li>
<li><strong>gse_plugins：</strong> 官方采集器插件目录</li>
<li><strong>image：</strong> SaaS 基础镜像目录</li>
<li><strong>java8.tgz：</strong> JDK 安装包</li>
<li><strong>job：</strong> 作业平台后台</li>
<li><strong>license：</strong> 鉴权服务</li>
<li><strong>MD5：</strong> MD5 校验文件</li>
<li><strong>official_saas：</strong> 官方 SaaS 包</li>
<li><strong>open_paas：</strong> PaaS 后台</li>
<li><strong>paas_agent：</strong> PaaS Agent 后台</li>
<li><strong>python：</strong> 蓝鲸定制 Python 解释器目录</li>
<li><strong>usermgr：</strong> 用户管理后台</li>
<li><strong>VERSION：</strong> 社区版版本号</li>
<li><strong>yum：</strong> 开源组件 RPM 包目录</li>
</ul><h1 id="_1">部署脚本</h1>
<p>安装蓝鲸时所用的部署脚本包 install/ 目录下也包含了日常维护用的脚本，用来做发布更新和故障排查。</p>
<p>运维脚本目录本身包含了用户配置的数据，主要体现在 install/bin/{01-generate,02-dynamic,03-userdef,04-final} 文件夹中。</p>
<p>中控机的 install 目录本身做任何变更前，请记得做好备份。其他机器的 install 目录，应该和中控机保持完全一致，所以无需额外备份。</p>
<p>由于部署过程会生成各个存储组件的随机密码到 install/01-generate 下，或者用户配置了相关的存储密码到 03-userdef/ 下，这些密码是明文存储的，请注意设置好相关访问权限，以免泄露。其中有一些以 BYTES 结尾的变量的值，用于 AES 加密，请妥善备份，丢失后，会无法解密数据库中加密存储的数据。</p>
<h2 id="_2">常用脚本说明</h2>
<p>相关重要运维脚本的作用作简要说明：</p>
<ul>
<li><strong>bk_install：</strong>  初次集成部署蓝鲸各模块时使用，安装完蓝鲸组件后，一般不需要使用它。</li>
<li><strong>bkcli：</strong> 命令行操作蓝鲸各模块的入口脚本，维护过程中会经常使用。</li>
<li><strong>deliver.sh：</strong> 对应 <code>bkcli sync</code> 操作实际调用的脚本，用来从中控机同步文件到其他模块主机。</li>
<li><strong>install.sh：</strong>  对应 <code>bkcli install</code> ，用来安装组件。</li>
<li><strong>initdata.sh：</strong> 对应 <code>bkcli initdata</code>，用来初始化数据。</li>
<li><strong>control.sh：</strong> 搭配 action.rc 对应 <code>bkcli &lt;start/stop/restart&gt;</code>，用来操作进程的启停。</li>
<li><strong>status.sh：</strong> 对应 <code>bkcli status</code>，用来查看进程的运行与否状态。</li>
<li><strong>check.sh：</strong> 对应 <code>bkcli check</code>，查看蓝鲸组件和依赖存储的健康状态。</li>
<li><strong>render.sh：</strong> 对应 <code>bkcli render</code>，根据环境变量渲染模块的配置模板。</li>
<li><strong>upgrade.sh：</strong> 对应 <code>bkcli upgrade</code>，用来升级更新组件版本，包括更新证书。</li>
<li><strong>update.rc：</strong> 对应 <code>bkcli update</code>，主机节点更新。</li>
<li><strong>configure_ssh_without_pass：</strong> 用来配置 ssh 免密。</li>
<li><strong>configure：</strong> 用来初次安装配置自定义域名和安装目录。</li>
<li><strong>pcmd.sh：</strong> 封装 pssh 命令的脚本，并行 ssh 到远端机器执行命令。</li>
<li><strong>sync.sh：</strong> 封装 prsync 命令的脚本，并行 rsync 同步文件到远端机器。</li>
<li><strong>functions：</strong> 一些通用共享的 bash 函数。</li>
<li><strong>tools.sh：</strong> 一些和蓝鲸安装逻辑相关的共享 bash 函数库。</li>
<li><strong>load_env.sh：</strong> 加载环境变量，通常用来 source 它，可以使用到一些变量来传递给维护脚本。</li>
<li><strong>utils.fc：</strong> 兼容以前脚本的习惯，它除了加载 load_env.sh，还加载 functions。</li>
<li><strong>health_check/*.sh：</strong> 一些健康检查的脚本，部分脚本会用 <code>bkcli check</code> 封装。</li>
<li><strong>check_bk_controller.sh：</strong> 检查中控机的环境是否满足安装需求，对应之前的 precheck。</li>
<li><strong>check_bk_node.sh：</strong> 检查安装蓝鲸的所有主机 node 节点的环境。</li>
<li><strong>check_cmdb_blueking_id：</strong> 查询 cmdb 上 名字为蓝鲸的业务 ID。</li>
<li><strong>check_cmdb_config_on_zk.sh：</strong> 检查 cmdb 在 zk 节点上的配置文件内容和本地的是否一致。</li>
<li><strong>check_cmdb_proc_on_zk.sh：</strong> 检查 cmdb 在 zk 节点上注册的服务 ip 和 port。</li>
<li><strong>check_consul_resolv.sh：</strong> 检查本机的 consul client 的 dns 解析功能是否正常。</li>
<li><strong>check_consul_svc_health.sh：</strong> 检查本机注册的 consul service 的健康情况，支持服务健康检查的列表在脚本中 hardcode。</li>
<li><strong>check_gse.sh：</strong> 检查 gse 的后台进程是否有不断重启。</li>
<li><strong>check_openresty.sh：</strong> 检查 openresty 上 nginx 的配置语法和 consul-template 进程是否存在。</li>
<li><strong>deploy_check.py：</strong> 检查蓝鲸依赖的存储/队列组件的连通性。</li>
<li><strong>monitor/*.sh：</strong> 一些自定义事件上报的监控脚本，用于辅助蓝鲸自监控的建设。</li>
<li><strong>install.config.*.sample：</strong> 初次部署的时候，配置 install.config 的参考分布文件。</li>
<li><strong>install_minibk：</strong> 安装单机的最小化部署蓝鲸（不推荐实际使用，仅用于测试部署脚本的流程）。</li>
<li><strong>minimal_tweak_config.sh：</strong> 配合 install_minibk 用，调整一些引起资源使用量大的参数，降低 cpu 和内存的消耗。</li>
<li><strong>qq.py</strong></li>
<li>解析蓝鲸工程目录下的 projects.yaml，拼成 bash 的环境变量，供安装脚本使用。</li>
<li>解析 default/port.yaml 获取开源组件的部署信息。</li>
<li><strong>release.md：</strong> 部署脚本的发行说明文档。</li>
<li><strong>saas_var.env：</strong> 初次部署 SaaS 时，自动初始化这些 SaaS 运行所依赖的环境变量列表到 PaaS 数据库。</li>
<li><strong>storage/dbbackup/*.sh：</strong> 数据库的备份脚本，请严格按照相应文档的说明使用。</li>
<li><strong>support-files/sql/*.sql：</strong> 部署脚本依赖的一些 mysql 库表初始化。</li>
<li><strong>support-files/templates/nginx/*.conf：</strong> 部署 nginx 时，需要从这些模板来生成实际的 nginx 子配置，如果有调整，请自行备份恢复。</li>
<li><strong>uninstall/uninstall.sh：</strong> 卸载脚本，本脚本需要在每台机器上单独运行且需要拷贝到上一级目录下才能正常运行，防止误操作。</li>
</ul>
<p>运维脚本还有存放在 install/bin/ 目录下的脚本/配置，单独说明如下，以下文件名都是相对于 install/bin 目录而言这些脚本的共同点是，它们可以在每台机器上单独执行，不依赖 ssh 免密登录，为了便于固化到《标准运维》本身调用而设计。</p>
<ul>
<li><strong>merge_env.sh：</strong> 合并出厂默认配置和用户配置，生成最终渲染配置文件的变量列表，它正常工作依赖以下几个文件夹中的文件：</li>
<li><strong>default/*.env：</strong> 存放蓝鲸出厂默认的各个组件配置渲染依赖的变量，每次更新脚本的时候，该目录直接覆盖更新。</li>
<li><strong>01-generate/dbadmin.env：</strong> 存放自动生成的存储组件随机密码，请注意妥善备份和保管。</li>
<li><strong>01-generate/{模块}.env：</strong> 存放初次部署时一次性生成的密码类变量，理论上整个蓝鲸运行生命周期中，不需要改动如果需要改动，得严格按照相关文档说明操作请注意妥善备份和保管。</li>
<li><strong>02-dynamic/hosts.env：</strong> 存放根据 install.config 文件自动生成的主机 IP 相关的变量和数组，它是程序维护的文件列表，可重复生成。<ul>
<li><strong>bk-install-config-parser.awk：</strong> 用于生成 hosts.env 的 awk 脚本，它的参数是 install.config 的路径，输出是 STDOUT。</li>
</ul>
</li>
<li><strong>03-userdef/{模块}.env：</strong> 存放针对该模块自定义的变量文件，会覆盖 default/01-generate 中同名文件中的值，优先级最高。</li>
<li><strong>04-final/{模块}.env：</strong> 通过 merge_env.sh &lt;模块&gt; 自动生成它是程序维护的文件列表，可重复生成。</li>
<li><strong>install_*.sh install：</strong> 开头的脚本是安装部署用的，分三类：</li>
<li>
<p>install_&lt;开源组件名&gt;.sh：** 安装和部署相关开源组件的脚本（一般是作为单实例安装），某些分布式模块，需要在安装后，做构建集群的配置，添加用户授权，会多一些脚本，列举如下：</p>
<ul>
<li><strong>setup_mongodb_rs.sh：</strong> 将 mongodb 单实例转换成 mongodb replica set 集群。</li>
<li><strong>setup_rabbitmq_cluster.sh：</strong> 将 rabbitmq 单实例构建为集群模式。</li>
<li><strong>setup_es_auth.sh：</strong> 配置 elasticsearch 的 auth 功能。</li>
<li><strong>add_rabbitmq_user.sh：</strong> 添加 rabbitmq 的账户和同名 vhosts。</li>
<li><strong>add_mongodb_user.sh：</strong> 添加 mongodb 的普通账户。</li>
<li><strong>grant_mysql_priv.sh：</strong> 给指定的 IP 列表，授权 mysql 的访问权限。</li>
<li><strong>setup_mysql_loginpath.sh：</strong> 配置 mysql 的 login-path，依赖 expect 自动输入密码。</li>
</ul>
</li>
<li>
<p>install_&lt;蓝鲸模块&gt;.sh：** 安装和部署蓝鲸模块的脚本，可在每台机器上独立运行。</p>
</li>
<li>install_&lt;其他辅助功能&gt;.sh：** 安装一些辅助功能，供其他脚本调用。<ul>
<li><strong>install_controller.sh：</strong> 在中控机上调用，通过<code>bkcli</code>命令，每次调用 bkcli 都会执行它它安装一些必备的命令，并将 install.config 生成为 hosts.env。</li>
<li><strong>install_py_venv_pkgs.sh：</strong> 对于 python 工程，第一步需要安装虚拟环境，然后根据 requirements.txt 来安装依赖的 pip 包，该脚本主要完成这一动作。</li>
<li><strong>install_yum.sh：</strong> 安装蓝鲸的开源组件需要依赖一些 rpm 包，统一使用一个自定义的 yum 仓库（bk-custom）来解决，install_yum.sh 辅助安装部署阶段启动一个临时的 yum 源。</li>
<li><strong>setup_local_pypiserver.sh：</strong> 配置本地的 pypi server。</li>
<li><strong>setup_local_yum.sh：</strong> 配置本地的 repo 文件，使用 install_yum.sh 搭建的 yum 仓库。</li>
</ul>
</li>
<li><strong>release_&lt;蓝鲸模块&gt;.sh：</strong> 更新蓝鲸模块的脚本，可在每台机器上独立运行。</li>
<li><strong>render_tpl：</strong> 最底层的 render 逻辑，通过读入的 env 文件，替换目标模块文件中的__占位符变量。</li>
<li><strong>bkr.sh：</strong> 封装 render_tpl 的脚本，根据传入的模块名，采取不同的在每台机器上通过变量文件，渲染对应的模块。</li>
<li><strong>bks.sh：</strong> 查看本机安装的蓝鲸组件的进程运行情况。</li>
<li><strong>update_bk_env.sh：</strong> 初始化/更新一台 linux 机器，做蓝鲸初始化用，这是新机器加入蓝鲸后台部署时，最先运行的脚本。</li>
<li><strong>add_or_update_appcode.sh：</strong> 往 paas 数据库的 esb_app_account 表中注册 appcode 和 secret，并添加到免登录态验证的白名单一般后台部署的服务需要使用，SaaS 的 app_code 和 app_secret，由 PaaS 自动维护。</li>
<li><strong>add_skip_auth_appcode.sh：</strong> 往 esb 的免登录态验证字段中追加 app_code，豁免校验登录态一般是新增加的 SaaS 如果需要后台任务请求 esb 时，需要调用它来豁免。</li>
<li><strong>bkiam_do_migrate.sh：</strong> 注册权限模型到权限中心的封装，并将注册成功的 json 文件做好标记到$HOME/.migrate/下。</li>
<li><strong>bkiam_do_migrate.py：</strong> 实际调用的这个 python 脚本，bash 脚本是为了获取一些变量拼接参数。</li>
<li><strong>bk_zkcli.sh：</strong> 操作的 zk，主要为 gse 和 cmdb 的 zk 节点内容查看提供便利，它依赖 zookeepercli 二进制，可通过 yum 安装。</li>
<li><strong>check_agent_info.sh：</strong> 检查 agent 的连接状态，用法 <code>cat iplist | ./check_agent_info.sh</code>。</li>
<li>创建蓝鲸拓扑的系列脚本：</li>
<li><strong>create_blueking_service_template.sh：</strong> 创建服务模板。</li>
<li><strong>create_blueking_topo_template.sh：</strong> 根据服务模板创建集群模板。</li>
<li><strong>create_blueking_set.py：</strong> 根据集群模板实例化为具体的集群。</li>
<li><strong>create_gse_zk_base_node.sh：</strong> 创建 gse 启动时依赖的 zk 的基础节点。</li>
<li><strong>create_gse_zk_dataid_1001_node.sh：</strong> 创建 basereport 上报的基础性能数据依赖的 1001 dataid 的 zk 节点。</li>
<li><strong>reg_consul_svc、dereg_consul_svc：</strong> 注册 consul 服务 / 解除注册 consul 服务，通过传入服务名，tag，以及监听的 port，生成服务定义的 json 文件。</li>
<li><strong>esb_api_test.sh：</strong> 调用 esb 的 api，主要是为其他脚本服务，对于简单的蓝鲸 api 调用提供便利。</li>
<li><strong>es_delete_expire_index.sh:</strong> 根据一定的命名规则，删除指定天数之前的 elasticsearch index，用于自动清理过期的索引。</li>
<li><strong>es_clean_index_by_query.sh:</strong> 根据日期删除指定 index 中的过期 document，通过_delete_by_query 接口查找后删除。</li>
<li><strong>generate_blueking_generate_envvars.sh：</strong> 为了初次部署的时候，自动生成 01-generate/*.env 文件。</li>
<li><strong>get_version.sh：</strong> 获取蓝鲸组件/开源软件的版本号。</li>
<li><strong>mongodb_drop_joblog_collection.sh:</strong> 清理 mongodb 中的过期的 joblog 表数据脚本。</li>
<li><strong>pack_gse_client_with_plugin.sh：</strong> 根据 gse 的包和 plugins 的包，合并为符合 nodeman 的安装的 gse_client 包。</li>
<li><strong>prepare-bk-ci.sh：</strong> 转化 CI（蓝盾）的开源部署包适配部署脚本。</li>
<li><strong>saas.py：</strong> 通过后台接口，部署 SaaS 的脚本。</li>
<li><strong>sql_migrate.sh：</strong> sql 导入的封装脚本，通过配置好免密的 mysql-login-path 名字导入对应的 sql 文件，并做好标记，标记存放到$HOME/.migrate/下，且<code>chattr +i</code> 防止误删除。</li>
<li><strong>single_host_low_memory_config.sh:</strong>  单机部署时，调低运行中进程的相应配置，减少内存消耗。</li>
<li><strong>zk4lw.sh</strong> 往 zookeeper 发送四字命令，获取返回结果的纯 bash 脚本，不依赖 nc 和 telnet</li>
</ul><h1 id="_1">安装环境准备</h1>
<p>开始安装蓝鲸社区版前，需按以下文档指南，做好准备工作。</p>
<p><strong>注意：所有待安装蓝鲸的机器均需要按以下清单检查和操作。</strong></p>
<h2 id="yum">YUM 源配置</h2>
<p>在所有蓝鲸服务器上配置好 YUM 源，要求该 YUM 源包含 EPEL。</p>
<p>不能连外网 YUM 源的环境，可以配置一个内部的 YUM 源 或者本地 YUM 源。</p>
<h3 id="_2">在线配置</h3>
<ul>
<li><a href="https://mirrors.cloud.tencent.com/help/centos.html">腾讯云 CentOS</a></li>
<li><a href="https://mirrors.cloud.tencent.com/help/epel.html">腾讯云 EPEL</a></li>
</ul>
<h2 id="centos">CentOS 系统设置</h2>
<p>准备好硬件，安装完原生 CentOS 系统后。需要对初始系统做一些配置，保证后续安装过程的顺畅和蓝鲸平台的运行。</p>
<p><strong>系统版本：</strong> 推荐 CentOS-7.6。</p>
<h2 id="selinux">关闭 SELinux</h2>
<pre class="codehilite"><code class="language-bash"># 检查 SELinux 的状态，如果它已经禁用，可以跳过后面的命令
sestatus</code></pre>


<p>可以使用以下命令禁用 SELinux，或者修改配置文件。</p>
<pre class="codehilite"><code class="language-bash"># 通过命令临时禁用 SELinux
setenforce 0

# 或者修改配置文件
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config</code></pre>


<p>接着，重启机器：</p>
<pre class="codehilite"><code class="language-bash">reboot</code></pre>


<h2 id="firewalld">关闭默认防火墙(firewalld)</h2>
<p>安装和运行蓝鲸时，模块之间互相访问的端口策略较多，建议对蓝鲸后台服务器之间关闭防火墙。</p>
<pre class="codehilite"><code class="language-bash"># 检查默认防火墙状态，如果返回 not running，可以跳过后面的命令
firewall-cmd --state</code></pre>


<p>停止并禁用 firewalld</p>
<pre class="codehilite"><code class="language-bash">systemctl stop firewalld    # 停止 firewalld
systemctl disable firewalld # 禁用 firewall 开机启动</code></pre>


<h2 id="rsync">安装 rsync 命令</h2>
<p>安装脚本依赖 rsync 分发同步文件。</p>
<pre class="codehilite"><code class="language-bash"># 检查是否有 rsync 命令，如果有返回 rsync 路径，可以跳过后面的命令
which rsync

# 安装 rsync
yum -y install rsync</code></pre>


<h2 id="_3">调整最大文件打开数</h2>
<pre class="codehilite"><code class="language-bash"># 检查当前 root 账号下的 max open files 值
ulimit -n</code></pre>


<p>如果为默认的 1024，建议通过修改配置文件调整为 102400 或更大。</p>
<p>但是不能大于 <code>/proc/sys/fs/nr_open</code> 的值，该值默认为 1048576。</p>
<p><strong>注意：</strong> limits.conf 初始文件的备份。</p>
<pre class="codehilite"><code class="language-bash">cat &gt;&gt; /etc/security/limits.conf &lt;&lt; EOF
root soft nofile 102400
root hard nofile 102400
EOF</code></pre>


<p>修改后，重新使用 root 登录检查是否生效。</p>
<h2 id="_4">确认服务器时间同步</h2>
<p>服务器后台时间不同步会对时间敏感的服务带来不可预见的后果。务必在安装和使用蓝鲸时保证时间同步。</p>
<pre class="codehilite"><code class="language-bash"># 检查每台机器当前时间和时区是否一致，若相互之间差别大于3s(考虑批量执行时的时差)，建议校时。
date -R

# 查看和ntp server的时间差异(需要外网访问，如果内网有ntpd服务器，自行替换域名为该服务的地址)
ntpdate -d cn.pool.ntp.org</code></pre>


<p>如果输出的最后一行 offset 大于 1s 建议校时。</p>
<pre class="codehilite"><code class="language-bash"># 和 ntp 服务器同步时间
ntpdate cn.pool.ntp.org</code></pre>


<p>更可靠的方式包括通过运行 ntpd 或者 chrony 等服务在后台保持时间同步。
具体请参考官方文档 <a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-configuring_ntp_using_ntpd">使用 ntpd 配置 NTP</a> 或 <a href="https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/system_administrators_guide/ch-Configuring_NTP_Using_the_chrony_Suite">使用 chrony 配置 NTP</a>。</p>
<h2 id="http">检查是否存在全局 HTTP 代理</h2>
<p>蓝鲸服务器之间会有的 HTTP 请求，如果存在 HTTP 代理，且未能正确代理这些请求，会发生不可预见的错误。</p>
<pre class="codehilite"><code class="language-bash"># 检查 http_proxy https_proxy 变量是否设置，若为空可以跳过后面的操作。
echo &quot;$http_proxy&quot; &quot;$https_proxy&quot;</code></pre>


<p>对于本机配置 http_proxy 变量的方式，请依次查找文件 /etc/profile、/etc/bashrc、$HOME/.bashrc 等是否有设置。
或者咨询网络管理员/IT 部门协助处理。</p>
<h2 id="_5">检查部署机器的主机名</h2>
<p>请检查准备用于部署蓝鲸的 3 台机器的主机名是否相同。如果存在同名请进行修改。</p>
<pre class="codehilite"><code class="language-bash"># 修改主机名
hostnamectl set-hostname &lt;新主机名&gt;
# 确认主机名修改成功
hostname</code></pre>


<h2 id="dns">检查 DNS 配置文件</h2>
<p>检查 DNS 配置文件 /etc/resolv.conf 是否被加锁，如有请临时解锁。</p>
<pre class="codehilite"><code class="language-bash"># 检查文件属性
lsattr /etc/resolv.conf

# 如有加锁，请临时解锁处理
chattr -i /etc/resolv.conf</code></pre>


<p>DNS 配置文件 /etc/resolv.conf 在安装蓝鲸过程中会自动修改。重启主机后，某些网络配置会导致该文件被还原为初始状态。</p>
<p>安装前先确认 <strong>“修改 /etc/resolv.conf 并重启主机，是否被还原”</strong> 。如果被还原，可以参考以下红帽官方的文档解决： <a href="https://access.redhat.com/solutions/7412">https://access.redhat.com/solutions/7412</a></p>
<h2 id="_6">准备相关软件包</h2>
<ul>
<li>
<p>请前往 <a href="https://bk.tencent.com/download/">蓝鲸官网下载页</a> 进行下载。</p>
</li>
<li>
<p>将下载的软件包放置需要部署的机器上。</p>
</li>
<li>
<p>解压软件包 <code>tar xf bkce_basic_suite-6.0.4.tgz -C /data</code>， 这里默认解压至 data 目录。</p>
</li>
<li>
<p>解压各产品软件包 <code>cd /data/src/; for f in *gz;do tar xf $f; done</code>。</p>
</li>
<li>
<p>拷贝 rpm 包文件夹到 /opt/ 目录 <code>cp -a /data/src/yum /opt</code>。</p>
</li>
</ul>
<h2 id="_7">准备证书文件</h2>
<ul>
<li>
<p>使用 gse 与 license 所在服务器的 MAC 地址，前往 <a href="https://bk.tencent.com/download_ssl/">蓝鲸官网证书生成页</a> 生成证书。</p>
</li>
<li>
<p>生成后请将证书文件放置与软件包同一台机器上。</p>
</li>
<li>
<p>解压证书文件，这里以 /data 目录为例</p>
<p><code>bash
install -d -m 755 /data/src/cert
tar xf /data/ssl_certificates.tar.gz -C /data/src/cert/
chmod 644 /data/src/cert/*</code></p>
</li>
</ul>
<h2 id="installconfig">准备 install.config 文件</h2>
<p><strong>说明：</strong></p>
<ul>
<li>gse 与 redis 需要部署在同一台机器上。</li>
<li>当含多个内网 IP 时，默认使用  /sbin/ifconfig 输出中的第一个内网 IP。</li>
<li>部署需要使用标准私有地址，若企业环境使用非标准私有地址，请参考 <a href="../环境准备/get_ready.md#非标准私有地址处理方法">环境准备-非标准私有地址处理方法</a></li>
</ul>
<pre class="codehilite"><code class="language-bash"># 请根据实际机器的 IP 进行替换第一列的示例 IP 地址，确保三个 IP 之间能互相通信
cat &lt;&lt; EOF &gt;/data/install/install.config
10.0.0.1 iam,ssm,usermgr,gse,license,redis,consul,mysql,lesscode
10.0.0.2 nginx,consul,mongodb,rabbitmq,appo
10.0.0.3 paas,cmdb,job,zk(config),appt,consul,nodeman(nodeman)

EOF</code></pre>


<h2 id="_8">自定义域名、安装目录以及登陆密码</h2>
<p>以下操作只需要在中控机上执行</p>
<ul>
<li>
<p>部署前自定义域名以及安装目录</p>
<p>\$BK_DOMAIN：需要更新的根域名。</p>
<p>\$INSTALL_PATH：自定义安装目录。</p>
<p>```bash</p>
<h1 id="bktencentcom">执行前请使用实际的顶级域名 (如：bktencent.com) 和安装目录进行替换</h1>
<p>cd /data/install 
./configure -d $BK_DOMAIN -p $INSTALL_PATH
```</p>
</li>
<li>
<p>部署前自定义 admin  登陆密码</p>
<p><strong>请使用实际的自定义密码替换 BlueKing，以及使用实际的部署脚本路径替换默认的脚本路径 <code>/data/install</code>。</strong></p>
<p><code>bash
cat &gt; /data/install/bin/03-userdef/usermgr.env &lt;&lt; EOF
BK_PAAS_ADMIN_PASSWORD=BlueKing
EOF</code></p>
</li>
</ul>
<h2 id="_9">非标准私有地址处理方法</h2>
<p>蓝鲸社区版部署脚本中(install 目录)有文件获取 IP 的函数 <code>get_lan_ip</code>，非标准地址，需要在安装部署前完成修改。</p>
<p>修改方法：</p>
<p>假设服务器的的 IP 是：138.x.x.x，它不在标准的私有地址范围，那么需要修改 get_lan_ip () 函数为：</p>
<pre class="codehilite"><code class="language-bash">vim /data/install/functions

get_lan_ip  () {
...省略
           if ($3 ~ /^10\./) {
               print $3
           }
           if ($3 ~ /^138\./) {
               print $3
           }
      }

return $?
}</code></pre>


<p>完成环境准备后，可前往 <a href="../多机部署/quick_install.md">基础套餐详细部署</a> 开始部署了。</p><h1 id="_1">基础套餐详细部署</h1>
<blockquote>
<p>该文档适用于生产环境多机器分模块部署场景，如仅需体验该套餐功能，可参考 <a href="../单机部署/install_on_single_host.md">基础套餐单机部署</a></p>
</blockquote>
<p><strong>每一个步骤执行如果有报错，需要修复错误，保证安装成功后，才可以继续</strong>。因为安装顺序是有依赖关系的，如果前面的平台失败仍继续往下安装，会遇到更多的报错导致整体安装失败。</p>
<p>修复错误所需要了解的相关命令，请参考 <a href="../../维护手册/日常维护/maintain.md">维护文档</a>。</p>
<p>进行标准部署之前，请确保已完成 <a href="../../基础包安装/环境准备/get_ready.md">环境准备</a> 操作。</p>
<h2 id="_2">执行免密</h2>
<pre class="codehilite"><code class="language-bash">cd /data/install
bash /data/install/configure_ssh_without_pass</code></pre>


<h2 id="_3">初始化并检查环境</h2>
<pre class="codehilite"><code class="language-bash"># 初始化环境
./bk_install common

# 校验环境和部署的配置
./health_check/check_bk_controller.sh</code></pre>


<blockquote>
<p>详细安装过程介绍，请查看<a href="../../基础包安装/安装详解/install_common.md">初始化并检查环境详解</a>。</p>
</blockquote>
<h2 id="paas">部署 PaaS 平台</h2>
<pre class="codehilite"><code class="language-bash"># 安装 PaaS 平台及其依赖服务
./bk_install paas</code></pre>


<blockquote>
<p>详细安装过程介绍，请查看<a href="../../基础包安装/安装详解/install_paas.md">安装 PaaS 平台详解</a>。</p>
</blockquote>
<h2 id="app_mgr">部署 app_mgr</h2>
<pre class="codehilite"><code class="language-bash"># 部署 SaaS 运行环境，正式环境及测试环境
./bk_install app_mgr</code></pre>


<blockquote>
<p>详细安装过程介绍，请查看<a href="../../基础包安装/安装详解/install_paas.md">安装 PaaS 平台详解</a>。</p>
</blockquote>
<h2 id="_4">部署权限中心与用户管理</h2>
<pre class="codehilite"><code class="language-bash"># 权限中心
./bk_install saas-o bk_iam
# 用户管理
./bk_install saas-o bk_user_manage</code></pre>


<h2 id="cmdb">部署 CMDB</h2>
<pre class="codehilite"><code class="language-bash"># 安装配置平台及其依赖服务
./bk_install cmdb</code></pre>


<blockquote>
<p>详细安装过程介绍，请查看<a href="../../基础包安装/安装详解/install_cmdb.md">安装配置平台详解</a>。</p>
</blockquote>
<h2 id="job">部署 JOB</h2>
<pre class="codehilite"><code class="language-bash"># 安装作业平台后台模块及其依赖组件
./bk_install job</code></pre>


<blockquote>
<p>详细安装过程介绍，请查看<a href="../../基础包安装/安装详解/install_gse.md">安装管控平台详解</a>和<a href="../../基础包安装/安装详解/install_job.md">安装作业平台详解</a>。</p>
</blockquote>
<h2 id="bknodeman">部署 bknodeman</h2>
<ul>
<li>
<p>如需使用跨云管控，请提前将节点管理的外网 IP 写入至节点管理后台服务所在机器的<code>/etc/blueking/env/local.env</code> 文件，详细请参考 <a href="../../维护手册/日常维护/open_proxy.md">开启 proxy</a>。否则请忽略该步骤</p>
</li>
<li>
<p>开始部署</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 安装节点管理后台模块、节点管理 SaaS 及其依赖组件
./bk_install bknodeman</code></pre>


<blockquote>
<p>详细安装过程介绍，请查看<a href="../../基础包安装/安装详解/install_nodeman.md">安装节点管理详解</a>。</p>
</blockquote>
<h2 id="_5">部署标准运维及流程管理</h2>
<p>依次执行下列命令部署相关 SaaS。</p>
<pre class="codehilite"><code class="language-bash"># 标准运维
./bk_install saas-o bk_sops

# 流程管理
./bk_install saas-o bk_itsm</code></pre>


<h2 id="_6">加载蓝鲸相关维护命令</h2>
<pre class="codehilite"><code class="language-bash">source ~/.bashrc</code></pre>


<h2 id="_7">初始化蓝鲸业务拓扑</h2>
<pre class="codehilite"><code class="language-bash">./bkcli initdata topo</code></pre>


<h2 id="lesscode">部署 lesscode (可选)</h2>
<pre class="codehilite"><code class="language-bash">./bk_install lesscode</code></pre>


<h2 id="_8">检测相关服务状态</h2>
<pre class="codehilite"><code class="language-bash">cd /data/install/
echo bkssm bkiam usermgr paas cmdb gse job consul | xargs -n 1 ./bkcli check</code></pre>


<h2 id="_9">访问蓝鲸开始使用</h2>
<p>可参考蓝鲸 <a href="../../../../快速入门/quick-start-v6.0-info.md">快速入门</a> 以及相关 <a href="https://bk.tencent.com/docs/">产品白皮书</a> 。</p>
<p>如需部署监控日志套餐，请参考 <a href="./value_added.md">监控日志套餐部署</a> 。</p><h1 id="_1">基础套餐单机部署</h1>
<h2 id="_2">环境准备</h2>
<ul>
<li>
<p>准备一台 CentOS 7.6 及以上操作系统的机器 (物理机和虚拟机均可)。</p>
</li>
<li>
<p>按照安装 <a href="../../基础包安装/环境准备/get_ready.md">环境准备</a> 章节中，主机和系统环境的要求做好相应设置。</p>
</li>
<li>
<p>配置好 YUM 源，包含 EPEL 仓库(可以通过 <code>yum info pssh</code> 测试下)。</p>
</li>
<li>
<p>从 <a href="http://bk.tencent.com/download/">官网下载</a> 基础套餐，并解压到 /data 下。实际版本请以蓝鲸官网下载为准。</p>
<p><code>bash
tar xf bkce_basic_suite-6.0.5.tgz -C /data</code></p>
</li>
<li>
<p>获取机器的 MAC 地址后，下载 <a href="https://bk.tencent.com/download_ssl/">证书文件</a>，解压到 /data/src/cert 目录下</p>
<p><code>bash
install -d -m 755 /data/src/cert
tar xf ssl_certificates.tar.gz -C /data/src/cert
chmod 644 /data/src/cert/*</code></p>
</li>
<li>
<p>解压各个产品软件包</p>
<p><code>bash
cd /data/src/; for f in *gz;do tar xf $f; done</code></p>
</li>
<li>
<p>拷贝 rpm 软件包</p>
<p><code>bash
cp -a /data/src/yum /opt</code></p>
</li>
<li>
<p>修改 /data/install/bk_install 脚本</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash"> cd /data/install/
 sed -i '/start job/i\\t./pcmd.sh\ -m\ job\ \&quot;sed -i '\'/JAVA_OPTS/c\ JAVA_OPTS=&quot;-Xms128m -Xmx128m&quot;\'\ /etc/sysconfig/bk-job-*\&quot; bk_install</code></pre>


<ul>
<li>install.config 这个文件安装脚本会自动生成，无需自行配置。</li>
</ul>
<h2 id="_3">执行安装</h2>
<p>如果部署全部组件，请执行：</p>
<pre class="codehilite"><code class="language-bash">cd /data/install
./install_minibk -y</code></pre>


<p>安装过程中遇到失败的情况，请先定位排查解决后，再重新运行失败时的安装指令。</p>
<p>执行完部署后，执行降低内存消耗脚本。以确保环境的稳定</p>
<pre class="codehilite"><code class="language-bash"># 执行降低内存消耗脚本
bash bin/single_host_low_memory_config.sh tweak all</code></pre>


<h2 id="_4">加载蓝鲸相关维护命令</h2>
<pre class="codehilite"><code class="language-bash">source ~/.bashrc</code></pre>


<h2 id="_5">初始化蓝鲸业务拓扑</h2>
<pre class="codehilite"><code class="language-bash">./bkcli initdata topo</code></pre>


<h2 id="_6">访问蓝鲸</h2>
<blockquote>
<p>下面介绍的操作均可能覆盖现有 hosts ，进行操作前请先确认是否需要备份。</p>
</blockquote>
<h3 id="host">配置 host</h3>
<ol>
<li>Windows 配置</li>
</ol>
<p>用文本编辑器（如 <code>Notepad++</code>）打开文件：</p>
<pre class="codehilite"><code class="language-bash">C:\Windows\System32\drivers\etc\hosts</code></pre>


<p>将以下内容复制到上述文件内，并将以下 IP 需更换为本机浏览器可以访问的 IP，然后保存。</p>
<pre class="codehilite"><code class="language-bash">10.0.0.2 paas.bktencent.com cmdb.bktencent.com job.bktencent.com jobapi.bktencent.com
10.0.0.3 nodeman.bktencent.com</code></pre>


<p><strong>注意：</strong> 10.0.0.2 为 nginx 模块所在的机器，10.0.0.3 为 nodeman 模块所在的机器。IP 需更换为本机浏览器可以访问的 IP。</p>
<p>查询模块所分布在机器的方式：</p>
<pre class="codehilite"><code class="language-bash">grep -E &quot;nginx|nodeman&quot; /data/install/install.config</code></pre>


<blockquote>
<p>注意：如果遇到无法保存，请右键文件 hosts 并找到“属性” -&gt; “安全”，然后选择你登陆的用户名，最后点击编辑，勾选“写入”即可。</p>
</blockquote>
<ol>
<li>Linux / Mac OS 配置</li>
</ol>
<p>将以下内容复制到 <code>/etc/hosts</code> 中，并将以下 IP 需更换为本机浏览器可以访问的 IP，然后保存。</p>
<pre class="codehilite"><code class="language-bash">10.0.0.2 paas.bktencent.com cmdb.bktencent.com job.bktencent.com jobapi.bktencent.com
10.0.0.3 nodeman.bktencent.com</code></pre>


<h3 id="_7">获取管理员账户名密码</h3>
<p>在任意一台机器上，执行以下命令，获取管理员账号和密码。</p>
<pre class="codehilite"><code class="language-bash">grep -E &quot;BK_PAAS_ADMIN_USERNAME|BK_PAAS_ADMIN_PASSWORD&quot; /data/install/bin/04-final/usermgr.env</code></pre>


<h2 id="_8">日常维护</h2>
<p>日常维护和运维，单机部署和多机是一致的，请参考 <a href="../../维护手册/日常维护/maintain.md">维护文档</a>。</p>
<h2 id="_9">使用蓝鲸</h2>
<p>可参考蓝鲸 <a href="../../../../快速入门/quick-start-v6.0-info.md">快速入门</a> 以及相关 <a href="https://bk.tencent.com/docs/">产品白皮书</a></p>
<p>如需部署监控日志套餐，请参考 <a href="../多机部署/value_added.md">监控日志套餐部署</a> 。</p><h1 id="_1">环境验证</h1>
<h2 id="_2">基础套餐后台验证</h2>
<ul>
<li>
<p>加载环境变量和蓝鲸安装维护的函数</p>
<p><code>bash
source /data/install/utils.fc</code></p>
</li>
<li>
<p>执行以下命令，检查蓝鲸的服务状态</p>
<p><code>bash
echo bkssm bkiam usermgr paas cmdb gse job consul | xargs -n 1 ./bkcli check</code></p>
</li>
<li>
<p>检查脚本可用性</p>
<p>```bash</p>
<h1 id="dbcheck">安装 dbcheck 环境</h1>
<p>./bkcli install dbcheck
./bkcli check dbcheck
```</p>
</li>
<li>
<p>检查开源组件状态， 可以使用 bkcli 或者 systemctl 查看运行的状态</p>
</li>
<li>
<p>bkcli</p>
<p><code>bash
echo redis rabbitmq mongodb consul zk | xargs -n 1 ./bkcli status</code></p>
</li>
<li>
<p>systemctl 相关组件服务名称可见 <a href="../../维护手册/日常维护/start_stop.md">组件维护</a></p>
<p>```bash</p>
<h1 id="rabbitmq">这里以 rabbitmq 为例，其余同理</h1>
<h1 id="_3">需要登录至模块分布的机器上</h1>
<p>ssh $BK_RABBITMQ_IP
systemctl status rabbitmq-server.service 
```</p>
</li>
</ul>
<h2 id="_4">基础套餐前台验证</h2>
<p>请先 <strong>配置 host 或者 DNS</strong> 解析后，确认访问社区版域名是否正常。</p>
<p>查看相关域名请查看部署脚本下的 $CTRL_DIR/bin/04-final/global.env 文件 \&lt; $CTRL_DIR 为实际的部署脚本目录 > 。</p>
<ul>
<li>
<p>从【蓝鲸工作台】-【开发者中心】-【服务器信息】中检查 <code>正式服务器</code> 是否激活。</p>
<p><img alt="APPO状态检查图" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/paas_appostatuscheck.png" /></p>
</li>
<li>
<p>从【蓝鲸工作台】-【开发者中心】-【第三方服务】中检查 <strong>RabbitMQ 服务</strong> 是否激活。</p>
<p><img alt="RabbitMQ状态检查图" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/paas_rabbitmqstatuscheck.png" /></p>
</li>
<li>
<p>打开节点管理，安装部署环境机器的 Agent。</p>
<p><img alt="install_agent" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/基础包安装/..assets/../../assets/install_agent.png" /></p>
</li>
</ul>
<h2 id="_5">增强套餐后台验证</h2>
<ul>
<li>
<p>执行以下命令，检查蓝鲸的服务状态</p>
<p><code>bash
echo bklog bkmonitorv3 | xargs -n 1 ./bkcli check</code></p>
</li>
</ul>
<h2 id="_6">增强套餐前台验证</h2>
<ul>
<li>打开蓝鲸监控平台，查看蓝鲸的数据链路是否正常</li>
</ul>
<p>如果只有 bk_data \&lt;社区版不含计算平台> 为红色则正常 。否则需要针对显红的地方进行排查直至显绿。</p>
<p><img alt="bkmonitorv3" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/bkmonitorv3_status.png" /></p>
<p>最后在蓝鲸工作台打开各个 SaaS 验证各产品功能是否能运行正常。</p><h1 id="_1">一、安装环境准备</h1>
<h2 id="_2">基础环境依赖</h2>
<p>社区版 V6.0+ 以上的基础包软件，必须包含 4 个基础平台和 4 个基础 SaaS：</p>
<table><tbody>
<tr><th width="20%" align='center'>基础平台</th><th width="20%" align='center'>基础 SaaS</th></tr>
<tr><td width="20%" align='center'>管控平台</td><td width="20%" align='center'>用户管理</td></tr>
<tr><td width="20%" align='center'>配置平台</td><td width="20%" align='center'>权限中心</td></tr>
<tr><td width="20%" align='center'>作业平台</td><td width="20%" align='center'>节点管理</td></tr>
<tr><td width="20%" align='center'>PaaS 平台</td><td width="20%" align='center'>标准运维</td></tr>
</tbody></table>

<h2 id="_3">服务器资源准备</h2>
<ol>
<li>
<p>建议操作系统： CentOS 7.6</p>
</li>
<li>
<p>服务器网络要与安装蓝鲸社区版基础包的服务器相通，在配置平台中需放在同一业务下</p>
</li>
<li>
<p>容器管理平台服务器不能与 K8S 集群服务器、蓝鲸基础服务服务器共用，需要独立申请，否则会导致端口冲突等环境问题</p>
</li>
<li>
<p>K8S 集群服务器不能与容器管理平台服务器、蓝鲸基础服务服务器共用，需要独立申请，否则会导致端口冲突等环境问题</p>
</li>
<li>
<p>Harbor 私有仓库 IP 地址、BCS 导航页组件 IP 地址与 BCS 监控 IP 地址都会占用 TCP 80 端口，需要部署在 3 台不同的服务器上以免端口冲突</p>
</li>
<li>
<p>容器管理平台服务器配置与所需数量</p>
</li>
</ol>
<p><strong>体验环境（共 3 台）</strong>
   <table><tbody>
   <tr><th width="10%" align='center'>机器</th><th align='center'>安装服务</th><th align='center'>配置</th></tr>
   <tr><td width="10%" align='center'>机器 1</td><td align='center'>MYSQL 数据库、MongoDB 数据库、Redis 数据库、Harbor 私有仓库（客户端浏览器可访问的 IP）</td><td>最低使用 4 核 CPU、8G 内存、200G 磁盘（1 台）</td></tr>
   <tr><td width="10%" align='center'>机器 2</td><td align='center'>BCS 后台服务、BCS 导航页（客户端浏览器可访问的 IP）、web_console 服务</td><td>最低使用 4 核 CPU、8G 内存、100G 磁盘（1 台）</td></tr>
   <tr><td width="10%" align='center'>机器 3</td><td align='center'>容器监控服务</td><td>最低使用 4 核 CPU、4G 内存、100G 磁盘（1 台）</td></tr>
   </tbody></table></p>
<p><strong>生产环境（共 10 台）</strong>
   <table><tbody>
   <tr><th width="10%" align='center'>机器</th><th align='center'>安装服务</th><th align='center'>配置</th></tr>
   <tr><td width="10%" align='center'>机器 1</td><td align='center'>MYSQL 数据库</td><td>最低使用 4 核 CPU、8G 内存、200G 磁盘（1 台，如果已有 MYSQL 实例无需准备服务器）</td></tr>
   <tr><td width="10%" align='center'>机器 2</td><td align='center'>MongoDB 数据库</td><td>最低使用 4 核 CPU、8G 内存、200G 磁盘（1 台，如果已有 MongoDB 实例无需准备服务器）</td></tr>
   <tr><td width="10%" align='center'>机器 3</td><td align='center'>Redis 数据库</td><td>最低使用 4 核 CPU、4G 内存、50G 磁盘（1 台，如果已有 Redis 实例无需准备服务器）</td></tr>
   <tr><td width="10%" align='center'>机器 4</td><td align='center'>Harbor 私有仓库</td><td>最低使用 4 核 CPU、4G 内存、300G 磁盘（1 台，客户端浏览器可访问的 IP）</td></tr>
   <tr><td width="10%" align='center'>机器 5-7</td><td align='center'>容器管理平台后台服务</td><td>最低使用 4 核 CPU、8G 内存、100G 磁盘（3 台，做高可用）</td></tr>
   <tr><td width="10%" align='center'>机器 8-9</td><td align='center'>BCS 导航页（客户端浏览器可访问的 IP）、web_console 服务可以部署在同一台服务器</td><td>最低使用 4 核 CPU、4G 内存、50G 磁盘（2 台，做高可用）</td></tr>
   <tr><td width="10%" align='center'>机器 10</td><td align='center'>容器监控服务</td><td>最低使用 4 核 CPU、8G 内存、200G 磁盘（1 台）</td></tr>
   </tbody></table></p>
<ol>
<li>K8S 集群服务器配置与数量</li>
</ol>
<p><strong>体验集群（最少 2 台）</strong>
   | 节点 | 配置 |
   |--|--|
   | master 节点 | 最低使用 4 核 CPU、8G 内存、100G 磁盘（1 台）|
   | node 节点 | 最低使用 4 核 CPU、8G 内存、100G 磁盘（按需申请）|</p>
<p><strong>生产集群（最少 4 台）</strong>
   | 节点 | 配置 |
   |--|--|
   | master 节点 | 最低使用 8 核 CPU、16G 内存、200G 磁盘（3 台，做高可用）|
   | node 节点 | 最低使用 8 核 CPU、16G 内存、200G 磁盘（按需申请）|</p>
<h2 id="_4">添加域名解析</h2>
<pre class="codehilite"><code class="language-bash"># Linux、Mac：/etc/hosts，Windows：C:\Windows\System32\drivers\etc\hosts
# BCS导航页组件IP地址（客户端浏览器可访问的地址） BCS导航页域名（BCS导航页域名前缀.蓝鲸基础域名） BCS导航页API域名（api-BCS导航页域名前缀.蓝鲸基础域名）
# 例如：
110.111.112.113 bcs.bktencent.com api-bcs.bktencent.com</code></pre>


<h2 id="gseagent">安装 GSEAgent</h2>
<p>使用节点管理 SaaS 导入服务器信息到配置平台与安装 GSEAgent</p>
<ul>
<li>节点管理使用方法请参考文档：<a href="https://bk.tencent.com/docs/markdown/节点管理/产品白皮书/Introduce/Overview.md">节点管理-产品白皮书</a></li>
<li>容器管理平台后台、K8S 集群服务器都需要导入服务器信息到配置平台与安装 GSE Agent，请把容器管理平台后台、K8S 集群服务器与安装蓝鲸社区版基础包的服务器放在同一业务下</li>
</ul>
<h2 id="_5">下载、解压安装包</h2>
<ul>
<li>下载安装包到社区版基础服务安装的中控机，因为容器管理平台安装包较大，请在相应分区至少保留 20G 的剩余空间（注：本文档以/data 目录为例，如果放到其他目录，请自行修改相关命令涉及到的路径）</li>
</ul>
<p>容器管理平台扩展软件包：bcs_ce-6.0.9.tgz</p>
<p><strong>下载完成后，请核对 MD5 码。</strong></p>
<ul>
<li>解压容器管理平台扩展软件包</li>
</ul>
<p><code>bash
   tar xvf bcs_ce-6.0.9.tgz -C /data/</code></p>
<h1 id="_6">二、开始部署</h1>
<h2 id="_7">部署方案说明</h2>
<p>容器管理平台部署全新采用标准运维模版部署，与传统部署方案相比具备页面可视化效果，可以使用作业平台的脚本执行功能与文件传输功能，操作简单方便，只需完成以下几个步骤即可完成部署：</p>
<ul>
<li>下载部署容器管理平台标准运维模版</li>
<li>导入标准运维模版</li>
<li>新建标准运维部署任务</li>
<li>标准运维参数填写</li>
<li>执行标准运维部署任务</li>
<li>容器管理平台部署完成</li>
</ul>
<h2 id="_8">标准运维模版说明</h2>
<table>
<thead>
<tr>
<th>标准运维模版名称</th>
<th>标准运维模版说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>[BlueKing][BCS][Basic] Environment Deployment</td>
<td>容器管理平台部署作业模版，用于部署容器管理平台组件，用户手工通过模版新建任务完成部署工作</td>
</tr>
<tr>
<td>[BlueKing][BCS][K8S] Create Master</td>
<td>容器管理平台 SaaS 调用此模版创建 K8S 集群，此模版请勿手工执行、修改、删除</td>
</tr>
<tr>
<td>[BlueKing][BCS][K8S] Remove Master</td>
<td>容器管理平台 SaaS 调用此模版删除 K8S 集群，此模版请勿手工执行、修改、删除</td>
</tr>
<tr>
<td>[BlueKing][BCS][K8S] Add Node</td>
<td>容器管理平台 SaaS 调用此模版添加 K8S 节点，此模版请勿手工执行、修改、删除</td>
</tr>
<tr>
<td>[BlueKing][BCS][K8S] Delete Node</td>
<td>容器管理平台 SaaS 调用此模版删除 K8S 节点，此模版请勿手工执行、修改、删除</td>
</tr>
</tbody>
</table>
<h2 id="_9">部署详细步骤</h2>
<ol>
<li>下载标准运维模版文件 bk_sops_common_ce_xxxx_xx_xx_xx.dat</li>
<li>打开标准运维---&gt;公共流程---&gt;导入---&gt;点击上传---&gt;选择标准运维模版文件 bk_sops_common_ce_xxxx_xx_xx_xx.dat---&gt;流程 ID 不变提交（因为 bcs-ops 模块需要关联标准运维模版流程 ID，如果流程 ID 有冲突请参考<a href="../../增强包维护/BCS/FAQ.md">BCS 维护手册-FAQ</a>的第 2 小点解决）
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/import_start.png" />
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/upload_dat_file.png" />
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/flow_id_commit.png" />
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/import_done.png" /></li>
<li>打开标准运维---&gt;公共流程---&gt;[BlueKing][BCS][Basic] Environment Deployment---&gt;新建任务
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/create_task.png" /></li>
<li>选择 容器管理平台后台服务器所在业务
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/select_biz.png" /></li>
<li>节点选择，不用修改，直接进入下一步
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/step_select.png" /></li>
<li>参数填写</li>
</ol>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/args_input.png" />
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/args_step_next.png" /></p>
<table><tbody>
<tr><td width="20%">安装包与安装脚本存放路径</td><td width="80%">社区版安装包（src 目录）、安装脚本存放路径（install 目录）和安装后文件存放路径（bkce），默认为/data，建议选择一个大一点的数据分区挂载路径</td></tr>
<tr><td width="20%">中控机 IP 地址</td><td width="80%">社区版基础服务安装的中控机 IP 地址，用于在此服务器上获取一些容器管理平台依赖的其它服务变量</td></tr>
<tr><td width="20%">是否新建 MySQL 实例</td><td width="80%">如果没有 MySQL 实例，这里不用修改，默认为 1，安装步骤会创建一个新的 MySQL 实例；如果已有 MySQL 实例这里修改为 0，安装步骤将会使用已有 MySQL 实例，不会安装新的 MySQL 实例;注意：使用已有MySQL实例时请提前给所有BCS服务器添加授权访问，参考以下命令：
source /data/install/load_env.sh 
/data/install/bin/grant_mysql_priv.sh -n default-root -u root -p ${BK_MYSQL_ADMIN_PASSWORD} -H 192.168.xx.xx #替换真实的bcs_ip </td></tr>
<tr><td width="20%">MySQL IP 地址</td><td width="80%">需安装或可连接的 MySQL 实例 IP 地址或域名，目前只支持单个 IP，如果已有实例是多节点，可以使用域名实现高可用；注意：如果“是否新建 MySQL 实例”值为 1 时，需要指定一台没有部署过 MySQL 实例的服务器上，防止 MySQL 端口冲突</td></tr>
<tr><td width="20%">MySQL 端口</td><td width="80%">MySQL 实例监听端口，默认为 3306，可根据实际情况自行修改</td></tr>
<tr><td width="20%">MySQL 用户名</td><td width="80%">MySQL 用户名，默认为 root，如需新建实例，这里会把实例设置成此用户名；如果是连接已有实例，请输入对应实例的用户名</td></tr>
<tr><td width="20%">MySQL 密码</td><td width="80%">MySQL 密码，如需新建实例，这里会把实例设置成此密码；如果是连接已有实例，请输入对应实例的密码</td></tr>
<tr><td width="20%">是否新建 Redis 实例</td><td width="80%">如果没有 Redis 实例，这里不用修改，默认为 1，安装步骤会创建一个新的 Redis 实例；如果已有 Redis 实例这里修改为 0，安装步骤将会使用已有 Redis 实例，不会安装新的 Redis 实例</td></tr>
<tr><td width="20%">Redis IP 地址</td><td width="80%">需安装或可连接的 Redis 实例 IP 地址或域名，目前只支持单个 IP，如果已有实例是多节点，可以使用域名实现高可用；注意：如果“是否新建 Redis 实例”值为 1 时，需要指定一台没有部署过 Redis 实例的服务器上，防止 redis 端口冲突</td></tr>
<tr><td width="20%">Redis 端口</td><td width="80%">Redis 实例监听端口，默认为 6379，可根据实际情况自行修改</td></tr>
<tr><td width="20%">Redis 密码</td><td width="80%">Redis 密码，如需新建实例，这里会把实例设置成此密码；如果是连接已有实例，请输入对应实例的密码</td></tr>
<tr><td width="20%">是否新建 MongoDB 实例</td><td width="80%">是否新建 MongoDB 实例：如果没有 MongoDB 实例，这里不用修改，默认为 1，安装步骤会创建一个新的 MongoDB 实例；如果已有 MongoDB 实例这里修改为 0，安装步骤将会使用已有 MongoDB 实例，不会安装新的 mongodb 实例；MongoDB 必须使用 2.4.x，使用高版本可能会存在兼容性问题，MongoDB 性能消耗较大，建议使用单独的服务器部署</td></tr>
<tr><td width="20%">MongoDB IP 地址</td><td width="80%">需安装或可连接的 MongoDB 实例 IP 地址或域名，目前只支持单个 IP，如果已有实例是多节点，可以使用域名实现高可用；注意：如果“是否新建 MongoDB 实例”值为 1 时，需要指定一台没有部署过 MongoDB 实例的服务器上，防止 MongoDB 端口冲突</td></tr>
<tr><td width="20%">MongoDB 端口</td><td width="80%">MongoDB 实例监听端口，默认为 27017，可根据实际情况自行修改</td></tr>
<tr><td width="20%">MongoDB 用户名</td><td width="80%">MongoDB 用户名，默认为 root，如需新建实例，这里会把实例设置成此用户名；如果是连接已有实例，请输入对应实例的用户名</td></tr>
<tr><td width="20%">MongoDB 密码</td><td width="80%">MongoDB 密码，如需新建实例，这里会把实例设置成此密码；如果是连接已有实例，请输入对应实例的密码</td></tr>
<tr><td width="20%">BCS 后台服务 IP 地址</td><td width="80%">容器管理平台后台服务部署的 IP 地址，容器管理平台后台服务包括 bcs-api、bcs-dns-service、bcs-storage、bcs-cc，同时还会部署容器管理平台后台服务所依赖的 etcd 与 zookeeper 服务，体验环境使用 1 台服务器即可，生产环境建议用 3 台服务器做高可用，多个 IP 使用半角逗号分隔</td></tr>
<tr><td width="20%">BCS 导航页组件 IP 地址</td><td width="80%">部署项目信息管理服务 IP 地址，负责项目创建及基本信息管理，生产环境建议用 2 台服务器做高可用，多个 IP 使用半角逗号分隔，此 IP 需要在客户端浏览器可访问</td></tr>
<tr><td width="20%">BCS 导航页域名前缀</td><td width="80%">容器管理平台 SaaS 的访问地址，默认为 bcs，例如基础平台使用 bktencent.com 的域名作为基础域名，那容器管理平台 SaaS 的访问地址为：http://bcs.bktencent.com</td></tr>
<tr><td width="20%">Web Console IP 地址</td><td width="80%">部署在提供 kubectl 命令行工具 IP 地址，可以使用 web 页面快捷查看集群内资源，生产环境建议用 2 台服务器做高可用，多个 IP 使用半角逗号分隔</td></tr>
<tr><td width="20%">BCS 监控 IP 地址</td><td width="80%">部署容器监控服务的 IP 地址，目前只支持单个 IP</td></tr>
<tr><td width="20%">Harbor 私有仓库 IP 地址</td><td width="80%">部署私有镜像仓库的 IP 地址，使用 Harbor 提供私有仓库服务，如果需要存放的镜像较多，需要部署在磁盘空间稍大的服务器上，目前只支持部署 1 台服务器；此 IP 需要在客户端浏览器可访问，访问 Harbor 页面管理方式为http://{外网 IP}，管理员用户名默认为：admin，密码为：Harbor12345</td></tr>
</tbody></table>

<ol>
<li>执行部署作业，执行作业过程中没有出现错误即部署正常，否则需要根据 job 执行错误信息解决问题
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/exec_task.png" /></li>
</ol>
<h1 id="_10">三、访问容器管理平台</h1>
<p>刷新蓝鲸工作台，会出现一个容器管理平台的 SaaS，点击图标会跳转到蓝鲸容器管理平台的 console 页面，也可以直接访问 URL <a href="http://bcs.bktencent.com">http://bcs.bktencent.com</a> 来访问容器管理平台，如果无法访问时，可能是 hosts 域名解析没有生效，可以关闭浏览器后重试。</p>
<p>完成以上步骤容器管理平台就已经部署完毕，<a href="../../增强包维护/BCS/Term.md">BCS 维护手册</a>可以帮助用户更全面的了解容器管理平台的内容和后期维护。</p>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/bcs_home.png" /></p>
<h1 id="_11">四、部署验收</h1>
<h2 id="bcs">BCS 后台部署验收</h2>
<p>标准运维作业可以正常执行完成，执行过程无错误出现</p>
<h2 id="bcs-k8s">BCS K8S 集群部署验收</h2>
<ol>
<li>可以正常 新建项目</li>
<li>容器服务 BCS-K8S</li>
<li>创建容器集群正常</li>
<li>添加节点正常</li>
<li>创建/同步/删除命名空间</li>
<li>变量管理/删除/添加变量</li>
<li>Helm/Chart 仓库存在 rumpetroll、blueking-nginx-ingress Chart</li>
<li>监控 Dashboard-BCS Node、BCS Cluster、BCS Pod 存在数据</li>
<li>存在告警策略（告警中、正常、停用其中一个不为 0）</li>
<li>指标查询随意查询一个指标有数据</li>
<li>告警历史/通知组/操作审计可以正常打开</li>
<li>删除节点正常</li>
<li>删除容器集群正常</li>
</ol><h1 id="_1">一、准备工作</h1>
<h2 id="_2">资源需求</h2>
<h3 id="_3">常规单点方案</h3>
<p>蓝盾根据资源配置需求可以分为 3 类，一般每类 1 台即可。构建机应当随并行的任务量增加而扩容。
1. 网关（ gateway ） <code>1c/4GB/100GB</code> （也可放入微服务节点，或者和其他非 web 服务复用机器 。）
2. 微服务（除 agentless 及 dockerhost ） <code>8c/32GB/100GB</code>
3. 构建机（ agentless 及 dockerhost ） <code>8c/16GB/100GB+500GB</code> （ <code>500GB</code> 的数据盘用于流水线任务的 workspace 缓存）</p>
<p>注：
1. 微服务及构建机配置可以升降并分散到更多的机器上，主要需要保障 java 内存需求。
2. artifactory 服务存在多实例时，需要共享的数据存储，建议使用 nfs ，或者其他能直接 mount 的网络文件系统。</p>
<h3 id="_4">最小化单点方案</h3>
<p>可以将网关、微服务及公共构建机部署到同一个节点上。推荐使用 <code>8c/32GB/100GB</code> 配置的服务器 1 台 ，最低配置可以为 <code>8c/16G/100G</code> 。</p>
<h3 id="_5">高可用方案</h3>
<p>参考 “常规单点方案” 直接把微服务及网关机器数量 x2 即可。
构建机（ <code>dockerhost</code> 及 <code>agentless</code> ）无法高可用，无需对数量翻倍。</p>
<p>如果任务途中构建机故障，则可能导致故障机器上的正在执行的任务中止或挂起。新发起任务会调度到存活的其他构建机上。</p>
<p>Web 高可用 需要用户自行准备前端 HA load balancer 。如 <code>HA-Proxy</code> 。在我们注册了蓝盾内部域名后，Consul 会自动维护集群内部 <code>bk-ci.service.consul</code> 域名的可用性（故障切换时间约为 0-3s ）。
微服务在存在多个实例时会自动调度实现负载均衡及高可用，此能力依赖 Consul 服务发现。</p>
<h2 id="_6">依赖的服务</h2>
<h3 id="consul">Consul</h3>
<p>蓝盾全部组件依赖 Consul 。版本 1 的稳定版即可。</p>
<h3 id="mysql">MySQL</h3>
<p>大部分微服务依赖 MySQL。版本建议 5.7。</p>
<h3 id="rabbitmq">RabbitMQ</h3>
<p>蓝盾使用 RabbitMQ 进行任务分配。 版本 3.7 或 3.8 。</p>
<p>需要 <code>delayed_message_exchange</code> 插件。</p>
<p>在 <strong>全部</strong> RabbitMQ 服务端执行如下命令安装并启用插件，需要重启服务端。</p>
<pre class="codehilite"><code class="language-bash">cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.8.3/plugins/
wget https://github.com/rabbitmq/rabbitmq-delayed-message-exchange/releases/download/v3.8.0/rabbitmq_delayed_message_exchange-3.8.0.ez
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
sleep 3  # 等3秒
rabbitmq-plugins list | grep rabbitmq_delayed_message_exchange  # 显示 E* 即为 启用+运行 状态。否则可能需要重启服务端。</code></pre>


<h3 id="redis">Redis</h3>
<p>缓存必不可少，网关及大部分微服务依赖 Redis 。 版本 &gt;2.8 。</p>
<blockquote>
<p>暂不支持 Sentinel 协议</p>
<p>目前微服务框架支持 Redis Sentinel ，但是 <code>ci(gateway)</code> 使用的 OpenResty 暂不支持，而 <code>ci(gateway)</code> 需要和微服务使用相同的 Redis 实例 ，故不支持 Sentinel 协议。</p>
</blockquote>
<h3 id="elasticsearch">ElasticSearch</h3>
<p><code>ci(log)</code> 需要 ElasticSearch ，使用 REST API 连接，要求 ElasticSearch 服务端版本 &gt;=7 。</p>
<h3 id="nfs">可选：NFS</h3>
<p>在部署了多个 <code>ci(artifactory)</code> 时，<code>ci(artifactory)</code> 数据目录需要使用共享存储，一般为 NFS 。</p>
<p>不然文件会分散到多个 <code>ci(artifactory)</code> 的本地存储，因为负载均衡后端的数据不一致，会导致同一个资源请求在 <code>404 Not Found</code> 和 <code>200 OK</code> 之间变动。</p>
<h3 id="influxdb">可选：InfluxDB</h3>
<p><code>ci(environtment)</code> 负责管理第三方构建机，如果在 env 文件中设置了<code>BK_CI_ENVIRONMENT_AGENT_COLLECTOR_ON=true</code>，则依赖 InfluxDB 。</p>
<h2 id="_7">依赖的软件或数据</h2>
<h3 id="sysstat">sysstat</h3>
<p><code>ci(agentless)</code> 服务使用自带的 libsigar.so 探测系统配置，后者需要 iostat 命令。</p>
<h3 id="docker">Docker</h3>
<p><code>ci(dockerhost)</code>及 <code>ci(agentless)</code> 需要主机提供 <code>dockerd</code> 。如果在容器内部署，则需映射主机的 <code>/var/run/docker.sock</code> 到容器内，确保容器内可以读写。</p>
<h2 id="_8">蓝盾安装包</h2>
<h3 id="_9">下载蓝盾安装包</h3>
<p>蓝盾的安装包请优先使用蓝鲸官方发布的安装包。此安装包会经过多轮部署及测试评估。</p>
<p>也可在 GitHub 下载 <code>v1.2</code> 版本的最新安装包。如果下载其他版本，则无法保证本文档的兼容性。
GitHub 下载地址： <a href="https://github.com/Tencent/bk-ci/releases">https://github.com/Tencent/bk-ci/releases</a></p>
<h3 id="_10">预处理蓝盾安装包</h3>
<p>自动解压并更新 env 模板。</p>
<p>用法：在预处理脚本后面添加下载的 蓝盾 tar.gz 包作为参数：</p>
<pre class="codehilite"><code class="language-bash">./bin/prepare-bk-ci.sh 蓝盾tar.gz包路径  # 在/data/install目录执行. </code></pre>


<h1 id="installconfig">二、配置 install.config</h1>
<p>此文件决定着决定哪些机器安装什么服务。</p>
<p>参考模板：</p>
<p>最小化单点方案</p>
<pre class="codehilite"><code class="language-bash"># 内存建议 32G ，至少 16G。CPU 建议8核。
10.0.1.1 ci(gateway),ci(dockerhost),ci(artifactory),ci(auth),ci(dispatch),ci(environment),ci(image),ci(log),ci(misc),ci(notify),ci(openapi),ci(plugin),ci(process),ci(project),ci(quality),ci(repository),ci(store),ci(ticket),ci(websocket)</code></pre>


<blockquote>
<p><strong>注意</strong></p>
<p><code>ci(dockerhost)</code> 与 <code>ci(agentless)</code> 使用相同的端口，因此不能部署在同一节点上。</p>
<p>故单节点最小化部署时，放弃 <code>ci(agentless)</code> （无编译环境）。</p>
<p>当然，您也可以选择保留 <code>ci(agentless)</code> ，放弃 <code>ci(dockerhost)</code> （公共构建机）。使用 <strong>项目专属</strong> 的 “私有构建机” 提供任务执行环境，详情请参考 “私有构建机方案“ 章节。</p>
</blockquote>
<p>常规单点方案</p>
<pre class="codehilite"><code class="language-bash"># gateway选择4G内存即可.
10.0.1.1 ci(gateway)
# 微服务总内存32G, 如果为多台机器组成, 请随意组合, 但是需要确保在同一个子网内. 其中, agentless为无编译环境, 一般和微服务放在一起.
10.0.1.2 ci(agentless),ci(artifactory),ci(auth),ci(dispatch),ci(environment),ci(image),ci(log),ci(misc),ci(notify),ci(openapi),ci(plugin),ci(process),ci(project),ci(quality),ci(repository),ci(store),ci(ticket),ci(websocket)
# 公共构建机也尽量放在同一子网. 建议内存8G起步. 数量视任务量而定, 如果任务量较多且耗时较长, 建议增加dockerhost节点的数量, 并升级磁盘性能.
10.0.1.2 ci(dockerhost)</code></pre>


<h1 id="_11">三、手动安装</h1>
<p>为了让用户更全面地了解整个软件的模块与服务，提供手动安装的详解过程，遇到问题可以快速定位。</p>
<blockquote>
<p><strong>注意</strong></p>
<p>所有的命令都预期在 <code>$CTRL_DIR</code> （默认为 <code>/data/install</code> ） 目录下执行。</p>
</blockquote>
<h2 id="_12">初始化新节点</h2>
<p>请参考蓝鲸新节点初始化文档完成如下的步骤。</p>
<h3 id="_13">配置免密</h3>
<p>配置免密，即可从中控机登录到对应的节点执行命令。</p>
<pre class="codehilite"><code class="language-bash">./configure_ssh_without_pass</code></pre>


<h3 id="bk-custom">配置 bk-custom 仓库</h3>
<p>请参考蓝鲸部署文档完成仓库配置。</p>
<p>用于安装 <code>java</code> 、 <code>docker-ce</code> 、 <code>openresty</code> 等软件包。</p>
<h3 id="consul-agent">安装 Consul agent</h3>
<pre class="codehilite"><code class="language-bash">pcmd -m ci '${CTRL_DIR:-/data/install}/bin/install_consul.sh -e $BK_CONSUL_KEYSTR_32BYTES -j $BK_CONSUL_IP_COMMA -r client --dns-port 53 -b $LAN_IP'</code></pre>


<h3 id="_14">环境初始设置</h3>
<p>在 <code>install.config</code> 中定义了新的节点 IP 后，我们应该尽快完成新节点的初始化。</p>
<p>使用如下的命令完成基础软件包安装，蓝鲸用户组创建，一些初始目录的创建等。</p>
<pre class="codehilite"><code class="language-bash">./bkcli update bkenv</code></pre>


<h2 id="env">编写 env 文件</h2>
<h3 id="env_1">env 路径说明</h3>
<p>env 模板位置： <code>./bin/default/ci.env</code>，在 “预处理蓝盾安装包” 章节里提过， <code>./bin/prepare-bk-ci.sh</code> 脚本会从蓝盾安装包中同步模板到此路径。</p>
<p>需要创建并修改 <code>./bin/03-userdef/ci.env</code>，具体操作请查看下面的 “ env 修改建议”。</p>
<p>在完成了 merge-env 后，会生成 <code>./bin/04-final/ci.env</code>，我们的安装脚本会读取此文件。</p>
<p>注：可以在 GitHub 查看社区版 6.0 的 env 模板文件： <a href="https://github.com/Tencent/bk-ci/blob/release-1.2/scripts/bkenv.properties">https://github.com/Tencent/bk-ci/blob/release-1.2/scripts/bkenv.properties</a></p>
<h3 id="env_2">env 修改建议</h3>
<p>依赖服务选择蓝鲸部署或云服务。</p>
<p>一般情况下，我们需要修改如下的变量：
1. 基础依赖变量，需要从已经安装的蓝鲸环境中获取赋值。
2. <code>BK_CI_APP_TOKEN</code>：取值为 uuid 。使用 <code>uuidgen</code> 或者 <code>uuid -v4</code> 命令可以生成一个 uuid 。
3. <code>BK_CI_AUTH_PROVIDER=bk_login_v3</code> 为蓝鲸社区版 6.0 部署时所需。 <code>bk_login</code> 已经不再支持。
4. 按需修改 <code>BK_CI_FQDN</code> 及 <code>BK_CI_PUBLIC_URL</code>，在安装成功后使用此地址访问蓝盾。
5. 按需填写 MySQL ， RabbitMQ ， es ， Redis 等配置信息。</p>
<blockquote>
<p><strong>注意</strong>：目前文档中描述为“蓝鲸环境下自动填充”的变量均需手动赋值修改。待后续改进 merge-env.sh 或提供其他解决办法。</p>
</blockquote>
<p>社区版 6.0 <code>./bin/03-userdef/ci.env</code> 最小化配置模板供参考：</p>
<pre class="codehilite"><code class="language-bash">BK_DOMAIN=填写主域名. 如果在腾讯云测试, 可以填写 个人的ID.bktencent.com
BK_HOME=/data/bkce
BK_HTTP_SCHEMA=http
BK_PAAS_PUBLIC_URL=填写PaaS的完整url. 一般为 http://paas.$BK_DOMAIN
BK_CI_AUTH_PROVIDER=bk_login_v3
BK_CI_FQDN=一般可以配置为 devops.$BK_DOMAIN
BK_CI_PUBLIC_URL=http://$BK_CI_FQDN  # 此处保持不变即可
BK_CI_MYSQL_ADDR=填写IP:3306
BK_CI_MYSQL_PASSWORD=填写密码
BK_CI_MYSQL_USER=bk_ci
BK_CI_RABBITMQ_ADDR=填写IP:5672
BK_CI_RABBITMQ_PASSWORD=填写密码
BK_CI_RABBITMQ_USER=bk_ci
BK_CI_RABBITMQ_VHOST=bk_ci
BK_CI_REDIS_DB=0
BK_CI_REDIS_HOST=填写IP
BK_CI_REDIS_PASSWORD=填写密码
BK_CI_REDIS_PORT=6379
BK_CI_ES_REST_ADDR=填写IP
BK_CI_ES_REST_PORT=9200
BK_CI_ES_USER=elastic  # 一般为此用户.
BK_CI_ES_PASSWORD=填写密码
BK_CI_APP_TOKEN=自己生成一个UUID-v4填在这里
BK_SSM_HOST=bkssm.service.consul  # 保持不变即可.
BK_CI_PAAS_LOGIN_URL=$BK_PAAS_PUBLIC_URL/login/\?c_url=  # 保持不变即可.
BK_CI_REPOSITORY_GITLAB_URL=http://$BK_CI_FQDN  # gitlab服务端如果有https, 且http端口会强制30x调整, 参考&quot;FAQ -- gitlab https适配问题&quot;章节.</code></pre>


<h2 id="env_3">合并 env</h2>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
./bin/merge_env.sh ci</code></pre>


<h2 id="env_4">校验最终 env 文件</h2>
<p>人工观察 env 文件是否存在渲染异常。</p>
<h2 id="env-installconfig">同步 env 及 install.config</h2>
<p>在安装前，需要确保所有节点的 env 文件是最新的。 merge_env 只会修改当前机器的。</p>
<p>这里直接同步整个 install 目录：</p>
<pre class="codehilite"><code class="language-bash">./bkcli sync common</code></pre>


<h2 id="_15">创建账户及权限</h2>
<blockquote>
<p><strong>注意</strong></p>
<p>本章节随附代码适用于蓝鲸社区版部署脚本部署的依赖服务。</p>
<p>如使用非蓝鲸部署的服务（如自建服务或采购的云服务），则无法直接使用下述代码，请自行查阅等价操作进行。</p>
</blockquote>
<h3 id="mysql_1">MySQL 账户授权</h3>
<p>本语句在 MySQL 节点执行：原则上仅对全部蓝盾节点授权，其他系统尽量通过 API 与蓝盾交互。严格情况下应该仅对微服务所在的节点授权。</p>
<p><code>-n login-path名称</code> 用于免密登录 MySQL 。如果提示名称不对，请使用 <code>mysql_config_editor print --all</code> 查看，或者参考蓝鲸部署文档完成 MySQL 的默认 login-path 设置。</p>
<pre class="codehilite"><code class="language-bash">source ${CTRL_DIR:-/data/install}/bin/04-final/ci.env  # 注意merge_env后操作.
echo &quot;$BK_CI_MYSQL_USER&quot; -p &quot;$BK_CI_MYSQL_PASSWORD&quot; -H &quot;$BK_CI_IP_COMMA&quot;  # 人工确认输出.
# 使用pcmd前往MySQL节点(这里假设复用了默认的MySQL, 故选择`$BK_CI_MYSQL_USER`)执行ci的授权操作. 注意不要使用 `-m mysql` 选择全部MySQL节点, 这样可能会执行多次.
pcmd -H &quot;$BK_MYSQL_IP&quot; '${CTRL_DIR:-/data/install}/bin/grant_mysql_priv.sh -n default-root -u &quot;$BK_CI_MYSQL_USER&quot; -p &quot;$BK_CI_MYSQL_PASSWORD&quot; -H &quot;$BK_CI_IP_COMMA&quot;'</code></pre>


<p>因为中控机上将会执行 <code>./bin/sql_migrate.sh</code> （见 “导入数据库 SQL” 章节），所以需要授权中控机访问蓝盾数据库：</p>
<pre class="codehilite"><code class="language-bash">pcmd -H &quot;$BK_MYSQL_IP&quot; '${CTRL_DIR:-/data/install}/bin/grant_mysql_priv.sh -n default-root -u &quot;$BK_CI_MYSQL_USER&quot; -p &quot;$BK_CI_MYSQL_PASSWORD&quot; -H &quot;$(&lt;$CTRL_DIR/.controller_ip)&quot;'</code></pre>


<p>在成功添加了中控机的访问授权后，我们可以配置 <code>mysql</code> 命令的 login-path ，以便命令行调用：</p>
<blockquote>
<p><strong>注意</strong></p>
<p>如果使用自备的 MySQL 服务，请先完成账户创建并授权中控机 IP 访问，然后配置 env 文件，运行下述命令。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">source ${CTRL_DIR:-/data/install}/bin/04-final/ci.env  # 注意merge_env后操作.
${CTRL_DIR:-/data/install}/bin/setup_mysql_loginpath.sh -n mysql-ci -h &quot;${BK_CI_MYSQL_ADDR%:*}&quot; -u &quot;$BK_CI_MYSQL_USER&quot; -p &quot;$BK_CI_MYSQL_PASSWORD&quot;</code></pre>


<h3 id="rabbitmq_1">RabbitMQ 账户授权</h3>
<blockquote>
<p><strong>注意</strong>
<code>所有的</code> RabbitMQ 服务端需要启用 <code>delayed_message_exchange</code> 插件。</p>
</blockquote>
<p>在中控机执行：</p>
<pre class="codehilite"><code class="language-bash">pcmd -H &quot;$BK_RABBITMQ_IP&quot; '${CTRL_DIR:-/data/install}/bin/add_rabbitmq_user.sh -u &quot;$BK_CI_RABBITMQ_USER&quot; -p &quot;$BK_CI_RABBITMQ_PASSWORD&quot; -h &quot;$BK_CI_RABBITMQ_VHOST&quot;'</code></pre>


<p>说明：此处不使用 <code>-m rabbitmq</code>，是因为只需要在 1 台服务端执行即可。</p>
<h3 id="redis_1">Redis 加密</h3>
<p>Redis 暂不支持 Sentinel 协议。</p>
<p>一般复用 db 及 password 即可，部署及配置密码细节可参考蓝鲸部署文档。</p>
<h3 id="elasticsearch_1">elasticsearch 密码</h3>
<p>一般复用蓝鲸集群的 es7 即可，部署及配置用户认证细节可参考蓝鲸部署文档。</p>
<h3 id="influxdb_1">可选：InfluxDB</h3>
<p>在启用了第三方构建机实时状态后，才需要创建 InfluxDB 账户信息并设置蓝盾服务端的访问授权，请参考网络公开文档配置即可。</p>
<h2 id="sql">导入数据库 SQL</h2>
<p>仅在中控机执行。</p>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
./bin/sql_migrate.sh -n mysql-ci /data/src/ci/support-files/sql/*.sql</code></pre>


<p>如果出现报错，请检查是否完成了 “ MySQl 账户授权” 章节里对中控机的全部操作。</p>
<h2 id="esb">注册到 ESB</h2>
<p>注册 APP ：</p>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
source ./load_env.sh  # 加载变量, 方便下面的命令行使用.
# 一般使用PaaS的loginpath (mysql-paas)连接数据库：
./bin/add_or_update_appcode.sh &quot;$BK_CI_APP_CODE&quot; &quot;$BK_CI_APP_TOKEN&quot; &quot;蓝盾&quot; &quot;mysql-paas&quot;  # 注册app。第4个参数即是login-path。</code></pre>


<h2 id="iam">导入 IAM 权限模板</h2>
<blockquote>
<p><strong>注意</strong>
需要完成 “注册到 ESB ” 章节后，本操作方可进行。</p>
</blockquote>
<p>需要导入 IAM 权限模板 。仅在中控机执行。</p>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
source ./load_env.sh  # 加载变量, 方便下面的命令行使用.
./bin/bkiam_migrate.sh -t &quot;$BK_IAM_PRIVATE_URL&quot; -a &quot;$BK_CI_APP_CODE&quot; -s &quot;$BK_CI_APP_TOKEN&quot; /data/src/ci/support-files/bkiam/*.json</code></pre>


<h2 id="_16">安装</h2>
<h3 id="_17">同步部署脚本</h3>
<p>同步公共文件（其中包含 env 文件）到其他节点</p>
<pre class="codehilite"><code class="language-bash">./bkcli sync common</code></pre>


<h3 id="_18">同步蓝盾安装包</h3>
<p>最初的安装包是放在中控机的，但是安装时会读取本机的，所以需要将蓝盾的安装包从中控机同步到蓝盾节点：</p>
<pre class="codehilite"><code class="language-bash">./bkcli sync ci</code></pre>


<h3 id="java">安装 java</h3>
<p>在中控机使用 <code>pcmd</code> 在所有的蓝盾节点执行安装脚本。</p>
<blockquote>
<p><strong>提示</strong>
<code>pcmd</code> 是蓝鲸部署工具包提供的别名。在安装蓝鲸后可用。其来源一般如下：</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">alias pcmd='/data/install/pcmd.sh'</code></pre>


<p>安装蓝盾依赖的 JDK 。如果此时不安装，则安装脚本会在发现没有 <code>java</code> 命令时尝试自动安装 OpenJDK ：</p>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
source ./load_env.sh  # 加载变量, 方便下面的命令行使用.
pcmd -m ci '${CTRL_DIR:-/data/install}/bin/install_java.sh -p &quot;$BK_HOME&quot; -f /data/src/java8.tgz'</code></pre>


<h3 id="_19">安装蓝盾</h3>
<p><code>./bin/install_ci.sh</code> 会根据蓝鲸部署脚本提供的环境变量判断本机应该安装及启用何种服务。也可以 <code>-m</code> 强制指定。</p>
<p><code>-e</code> 参数后面为 env 文件路径，这里选择 merge 后的<code>./bin/04-final/ci.env</code>。</p>
<blockquote>
<p><strong>注意</strong>
1. 在执行安装前，请确保 env 文件是最新的。
2. 推荐使用 <code>-p "$BK_HOME"</code> 引用安装目录。
3. 安装程序会检查内存并适配。如果内存不满足，安装程序会在 “ <strong>PRECHECK</strong> ” 步骤主动退出。</p>
</blockquote>
<p>使用 pcmd 时，会在命令执行后才输出 stdout 和 stderr 到屏幕。因此如果部分节点配置的微服务较多，会等待 1-10 分钟不等。请耐心等待。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci 'cd ${CTRL_DIR:-/data/install}; export LAN_IP ${!BK_CI_*}; ./bin/install_ci.sh -e ./bin/04-final/ci.env -p &quot;$BK_HOME&quot; 2&gt;&amp;1;'</code></pre>


<blockquote>
<p><strong>重复安装蓝盾</strong>
如果安装出现问题，可以重复执行安装脚本。请提前在中控机完成 /data/src/ci 及 env 文件的更新及同步。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">./bin/merge_env.sh ci   # 汇总新的env
./bkcli sync common     # 同步公共文件(其中包含env)到其他节点
# 下述操作按需执行. 仅当修改了ci的安装包时才需要分发安装包到ci节点.
./bkcli sync ci
# 如下操作按需执行. 仅当修改了CI的数据库信息时才需要重新导入初始数据:
ls  ~/.migrate/*_ci_*  # 看mysql及bkiam的flag文件, 蓝鲸使用了flag文件避免重复导入mysql.sql及iam.json
chattr -i ~/.migrate/*_ci_*   # 关掉删除保护
rm ~/.migrate/*_ci_*    # 删除, 删除完成后，即可重新执行 sql_migrate.sh 和 bkiam_migrate.sh 了.</code></pre>


<h2 id="_20">启动服务</h2>
<p>启动全部的蓝盾服务。</p>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
pcmd -m ci 'systemctl start bk-ci.target'</code></pre>


<blockquote>
<p><strong>提示</strong>：当单节点部署时，因为服务同时启动，可能因 CPU 及磁盘资源问题导致整体启动时间更久，大约 1-5 分钟。期间 pcmd 可能无输出，请耐心等待。</p>
</blockquote>
<h2 id="_21">检查服务状态</h2>
<p>检查服务是否成功启动。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci '${CTRL_DIR:-/data/install}/bin/bks.sh'</code></pre>


<blockquote>
<p><strong>注意</strong>
<code>agentless</code> 会等待 <code>dispatch</code> 服务启动完毕后才开始启动。因耗时略久，可以临时忽略此服务的状态，继续下述步骤。</p>
</blockquote>
<h2 id="paas">注册到 PaaS 工作台</h2>
<p>可以将蓝盾注册到蓝鲸的 PaaS 工作台。注册完成后，蓝盾图标会出现在 PaaS 首页的“工作台”中。</p>
<p>部署脚本中提供了 <code>./bin/bk-ci-reg-paas-app.sh</code>，在中控机执行。</p>
<pre class="codehilite"><code class="language-bash">./bin/bk-ci-reg-paas-app.sh</code></pre>


<h2 id="_22">注册蓝鲸集群内部域名</h2>
<p>在对应蓝盾组件节点上注册 Consul 服务。</p>
<pre class="codehilite"><code class="language-bash"># 在全部 ci(gateway) 节点上注册主入口域名: bk-ci.service.consul, 用于在集群内提供web服务.
pcmd -m ci_gateway '${CTRL_DIR:-/data/install}/bin/reg_consul_svc -n bk-ci -p &quot;${BK_CI_HTTP_PORT:-80}&quot; -a &quot;$LAN_IP&quot; -D &gt; /etc/consul.d/service/bk-ci.json; consul reload'
# 在全部 ci(auth) 节点注册 ci-auth.service.consul, 供iam回调使用. 请勿更改此名称.
pcmd -m ci_auth '${CTRL_DIR:-/data/install}/bin/reg_consul_svc -n ci-auth -p &quot;${BK_CI_AUTH_API_PORT:-21936}&quot; -a &quot;$LAN_IP&quot; -D &gt; /etc/consul.d/service/ci-auth.json; consul reload'</code></pre>


<p>命令说明： <code>-n</code> 指定名称。 <code>-p</code> 为服务的端口， <code>-a</code> 为服务的 IP ，一般为本机内网 IP 。 Consul 会检查 IP 及端口是否可用，据此决定是否在解析结果中启用此 IP 。 <code>-D</code> 生成配置文件，然后重定向写入与服务名称相应的路径。</p>
<p>检查注册结果：</p>
<p>如果下述命令出现 IP ，则说明解析成功。</p>
<pre class="codehilite"><code class="language-bash">dig +short bk-ci.service.consul
dig +short ci-auth.service.consul</code></pre>


<p>排查：</p>
<p>如果上述解析失败。请先检查本机：
1. 本机 <code>/etc/resolv.conf</code>里第一个 nameserver 是否为 <code>127.0.0.1</code>。
2. 本机是否存在 Consul agent ，是否监听了 127.0.0.1:53 端口提供 DNS 服务。
3. Consul 加入的集群是否正确。</p>
<p>如果本机正常，则需要前往对应的节点（ ci_gateway 或 ci_auth ）检查：
1. 服务（ <code>ci(auth)</code> ， <code>ci(gateway)</code> ）是否正常（ <code>pcmd -m ci '/data/install/bin/bks.sh'</code> 脚本检查蓝鲸服务状态），服务端口是否正常监听（ <code>netstat -ntple</code> 或 <code>ss -ntl</code> 检查端口监听 ）。对应端口是否可建立连接（可以用 <code>curl</code> 进行连接测试）。
2. Consul 配置文件存在，路径 <code>/etc/Consul.d/service/xx.json</code> 。
3. Consul 的启动参数有 <code>/etc/Consul.d/service/</code> 目录，我们 systemd 启动的 Consul 存在 <code>-configdir /etc/consul.d/service/</code> 参数。</p>
<h2 id="dns-hosts">配置 DNS 解析或配置 hosts</h2>
<p>为了从外界访问蓝盾。您需要配置可用的 DNS 服务。在测试场景下，可以直接配置 hosts 。</p>
<p>可以考虑使用如下代码生成 hosts ：</p>
<pre class="codehilite"><code class="language-bash">source ${CTRL_DIR:-/data/install}/load_env.sh
for ip in ${BK_CI_GATEWAY_IP[@]-}; do
  printf &quot;%-15s %42s\n&quot; &quot;$ip&quot; &quot;$BK_CI_FQDN&quot;
done</code></pre>


<h2 id="_23">访问蓝盾的集群内地址</h2>
<p>蓝盾安装完成后，可以在集群内访问蓝盾的内部域名。</p>
<p>我们可以在中控机访问如下地址，预期会 302 到 http://bk-ci.service.consul/console/</p>
<pre class="codehilite"><code class="language-bash">curl -v http://bk-ci.service.consul</code></pre>


<h2 id="_24">访问蓝盾的公开地址</h2>
<blockquote>
<p><strong>注意</strong></p>
<p>访问蓝盾的公开域名时，请先完成 “配置 DNS 解析或配置 hosts ” 章节。确保客户端上能解析到 <code>$BK_CI_FQDN</code>，或者配置 hosts 文件。
以及网络是否互通，有些场景下需要配置代理或者网络策略方可。</p>
<p>当蓝盾在云上部署时，请留意配置 <code>云主机</code> 或 <code>负载均衡器</code> 的安全组，需放行您所在网络的公网 IP 。</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">source ${CTRL_DIR:-/data/install}/load_env.sh
curl -v &quot;$BK_CI_PUBLIC_URL&quot;</code></pre>


<h2 id="_25">注册构建机</h2>
<p>公共构建机需要注册到 dispatch 方可使用。</p>
<blockquote>
<p><strong>提示</strong>
后续会推出一个运营系统，目前需要在 <code>ci(dispatch)</code> 节点调用脚本完成注册。</p>
</blockquote>
<p>使用蓝盾安装包里的 <code>scripts/bkci-op.sh</code> 脚本在 <code>ci(dispatch)</code> 任一节点注册构建机，每个构建机 IP 仅需注册一次。</p>
<blockquote>
<p><strong>注意</strong>
执行 <code>bkci-op.sh</code> 请登录到 <code>$BK_CI_DISPATCH_IP</code> 节点。</p>
</blockquote>
<p>查看构建机</p>
<pre class="codehilite"><code class="language-bash">/data/src/ci/scripts/bkci-op.sh list  # list可以使用-v参数. 显示更多列.</code></pre>


<p>添加构建机，默认状态为 false ， dispatch 会在 dockerhost 心跳后自动设置为 true ：</p>
<pre class="codehilite"><code class="language-bash">ip=构建机IP
/data/src/ci/scripts/bkci-op.sh add &quot;$ip&quot; enable=false</code></pre>


<p>根据（蓝鲸部署根据解析 install.config 自动生成的）环境变量批量注册构建机：</p>
<pre class="codehilite"><code class="language-bash">source ${CTRL_DIR:-/data/install}/load_env.sh
for ip in ${BK_CI_DOCKERHOST_IP[@]-}; do
  echo &quot;$ip&quot;;
  /data/src/ci/scripts/bkci-op.sh add &quot;$ip&quot; enable=false; 
done</code></pre><h1 id="_1">统一术语</h1>
<ul>
<li>
<p><strong>BK_HOME：</strong> 安装路径，默认为 <code>/data/bkce</code></p>
</li>
<li>
<p><strong>CTRL_PATH：</strong> 安装维护脚本所在目录，默认为 <code>/data/install</code></p>
</li>
<li>
<p><strong>BK_PKG_SRC_PATH：</strong> 组件原始包解压目录，默认为 <code>/data/src</code></p>
</li>
<li>
<p><strong>中控机：</strong> 安装蓝鲸后台服务器中，选一台作为中控机，安装蓝鲸和运维蓝鲸，一般均从这台机器开始</p>
</li>
<li>
<p><strong>source load_env.sh：</strong> 一些操作需要加载蓝鲸环境变量和函数后才能调用。此为 <code>cd $CTRL_PATH/ &amp;&amp; source load_env.sh</code> 的简写</p>
</li>
<li>
<p><strong>bkcli \&lt;command> \&lt;module>：</strong> 若无特殊说明，含义是在<strong>中控机</strong>上执行命令：<code>cd $CTRL_PATH &amp;&amp; ./bkcli &lt;command&gt; &lt;module&gt;</code>。如重启 cmdb：<code>./bkcli restart cmdb</code></p>
</li>
</ul>
<p>后文提到路径时，均以默认路径为例，请根据实际安装路径修改相关命令</p><h1 id="_1">登陆指定服务器</h1>
<p>一般维护操作时，均从中控机出发，跳转到其他模块服务器进行操作。</p>
<p>假设发现作业平台模块启动失败，想登陆到作业平台模块所在服务器查看相关日志：</p>
<pre class="codehilite"><code class="language-bash"># 均以默认路径(/data/install)为例，请根据实际安装路径修改相关命令
cd /data/install/
source utils.fc

# 这个命令用来加载环境变量（/data/install/bin/{01-generate,02-dynamic,03-userdef,04-final}/*.env）加载一些通用函数。</code></pre>


<p>如登录至 JOB 模块所在机器：</p>
<pre class="codehilite"><code class="language-bash">ssh $BK_JOB_IP
# /data/install/bin/02-dynamic/hosts.env 文件通过解析 install.config ，生成了模块对应的 IP。
# 所以，我们可以直接用 $BK_MODULE_IP 这样的方式来访问。
# MODULE，用 install.config 里模块名的大写形式进行替换。例如 paas 所在机器 IP 为 $BK_PAAS_IP ，配置平台所机器 IP 为 $BK_CMDB_IP ，依此类推。
# 也可以输入 $ 符号后，用 $BK_&lt;tab&gt; 补全试试。</code></pre><h1 id="_1">查看日志</h1>
<p>蓝鲸部署和使用过程中遇到前台提示不明确的问题，需要查询后台日志定位。</p>
<p>本文描述，查看蓝鲸后台日志的方法、技巧。</p>
<h2 id="_2">进程启动日志</h2>
<p>社区版 6.0 使用 systemd 托管后，进程启动过程中如果有打印标准输出和标准错误日志，会定向到 systemd-journald 服务，通过 <code>journactl</code> 命令来查看。定位时常用的命令行参数如下：</p>
<ol>
<li>
<p>查看具体某个服务的日志，以查看 <code>bk-iam.service</code> 为例：</p>
<p><code>bash
journalctl -u bk-iam</code></p>
</li>
<li>
<p>如果日志过多充满一屏后，请通过翻页查看最新的日志，journalctl 会将日志文本导出给终端定义的 PAGER 程序，一般是 <code>more</code> 和 <code>less</code>，操作翻页和左右滚动，可以使用相应的快捷键。</p>
</li>
<li>
<p>只看最新的 50 行日志，并且直接输出，不经过 PAGER 处理：</p>
<p><code>bash
journalctl -u bk-iam -n 50 --no-pager</code></p>
</li>
<li>
<p>查看某个时间范围内的日志 ( --since 和 --until 可以组合也可以单独使用)：</p>
<p><code>bash
journalctl -u bk-iam.service --since "2021-01-14 11:00" --until "2021-01-14 11:05"</code></p>
</li>
</ol>
<p>还有后台进程启动日志，默认将标准输出和标准错误重定向到 <code>/dev/null</code> 了，这种进程需要通过调整配置来进行处理。
常见于后台 Python 工程，且使用 supervisord 进行了托管的服务。比如蓝鲸监控后台（bkmonitorv3）。假设监控的 <code>kernel_api</code> 进程显示 FAILED，我们需要定位启动失败的原因。</p>
<ol>
<li>修改监控的 supervisor 配置文件</li>
</ol>
<p>```bash
   # 登陆至监控模块所在的机器
   source /data/install/utils.fc
   ssh $BK_MONITORV3_IP0</p>
<p># 修改配置文件
   vim /data/bkce/etc/supervisor-bkmonitorv3-monitor.conf
    ```</p>
<ol>
<li>
<p>修改 <code>[program:kernel_api]</code> 配置下的 <code>stdout_logfile</code> 的值为一个临时路径，比如 <code>/data/bkce/logs/kernel_api_stdout.log</code></p>
</li>
<li>
<p>重启监控平台</p>
<p><code>bash
systemctl restart bk-monitor</code></p>
</li>
<li>
<p>查看服务启动失败的日志</p>
<p><code>bash
/data/bkce/logs/kernel_api_stdout.log</code></p>
</li>
<li>
<p>定位到问题后，可以还原 supervisor 配置。</p>
</li>
</ol>
<h2 id="_3">蓝鲸后台日志</h2>
<p>蓝鲸后台运行日志文件统一在 <code>$BK_HOME/logs/</code> 下，按模块名，组件名分目录存放。 <code>$BK_HOME/</code> 为安装蓝鲸时定义的目录，默认为 /data/bkce。如有修改，请根据实际安装路径修改相关命令。</p>
<p>假设需要查看作业平台 (job) 的 job-execute 进程的日志：</p>
<pre class="codehilite"><code class="language-bash"># 登陆至 JOB 模块所在的机器
source /data/install/utils.fc
ssh $BK_JOB_IP0

# 进入对应目录查看日志
cd /data/bkce/logs/job/job-execute/
ls -lrt *.log</code></pre>


<p>由于大多数日志会定期或者按大小滚动，我们查看当前错误的时候，一般只需要看最新的日志。所以使用 <code>ls</code> 命令按时间排序 <code>*.log</code>，可以确认我们需要继续追查的日志文件名。</p>
<p>例如继续看 execute.log</p>
<pre class="codehilite"><code class="language-bash">tail -f execute.log</code></pre>


<p>然后通过浏览器复现当时的错误场景，观察命令行窗口的日志滚动，当出现错误的时候，按下 <code>Ctrl-C</code> 中止，请根据文本含义尝试排查错误。实在无法解决时，将对应日志复制到文本文件，前往问答社区或者 QQ 群咨询。</p>
<h2 id="saas">蓝鲸 SaaS 日志</h2>
<p>SaaS 的日志路径较为特殊。如果是查看正式环境部署的 SaaS 日志，请登录到 APPO 所在主机。切换到 <code>$BK_HOME/paas_agent/apps/logs</code> 下，该目录下是根据 SaaS 的 APP_CODE 名进行分目录存放。</p>
<h2 id="_4">开源组件日志</h2>
<ul>
<li>
<p>Consul 的日志在 /var/log/consul/ 下，也可以通过 <code>consul monitor</code> 命令查看</p>
</li>
<li>
<p>Redis 的日志在 /var/log/redis/ 下，根据实例名命名的日志文件，比如 服务是 <code>redis@default.service</code> 那么日志文件是 /var/log/redis/default.log</p>
</li>
<li>
<p>MySQL 的日志在 <code>$BK_HOME/logs/mysql/实例名.mysqld.log</code> 慢查询日志在 <code>$BK_HOME/logs/mysql/实例名.slow-query.log</code></p>
</li>
<li>
<p>Nginx 的日志在 <code>$BK_HOME/logs/nginx/</code></p>
</li>
<li>
<p>MongoDB 的日志在 <code>$BK_HOME/logs/mongodb/</code></p>
</li>
<li>
<p>RabbitMQ 的日志在 <code>$BK_HOME/logs/rabbitmq/</code></p>
</li>
<li>
<p>Kafka 的日志在 <code>/var/log/kafka</code></p>
</li>
<li>
<p>Zookeeper 的日志在 <code>/var/log/zookeeper</code></p>
</li>
<li>
<p>Elasticsearch7 的日志在 <code>$BK_HOME/logs/elasticsearch/</code></p>
</li>
<li>
<p>InfluxDB 的日志在 <code>$BK_HOME/logs/influxdb/</code></p>
</li>
</ul><h1 id="_1">变更域名</h1>
<p>安装部署后，BK_DOMAIN 默认使用的是 bktencent.com，如果需要修改成其他的域名。例如换成 bktencent.org，可以按以下步骤进行：</p>
<ol>
<li>
<p>备份中控机的 install 目录</p>
<p><code>bash
tar -czf /data/src/backup/install_ce_$(date +%Y%m%d).tgz -c /data/install</code></p>
</li>
<li>
<p>运行变更域名脚本 <strong>（请使用实际的域名进行替换）</strong></p>
<p><code>bash
cd /data/install
source utils.fc &amp;&amp; source ~/.bkrc
./bin/change_bk_domain.sh bktencent.org</code></p>
</li>
<li>
<p>上述脚本运行成功后:</p>
<ul>
<li>
<p>如果域名是配置的本地 hosts 文件，请修改本机的 hosts 文件。</p>
</li>
<li>
<p>如果是通过 DNS 解析的，请修改相应的 DNS 解析。</p>
</li>
</ul>
</li>
<li>
<p>请重新部署所有官方 SaaS</p>
<p><code>bash
./bkcli install saas-o</code></p>
</li>
<li>
<p>重新部署 lesscode</p>
<p><code>bash
./bkcli install lesscode
./bkcli initdata lesscode
./bkcli restart lesscode</code></p>
</li>
<li>
<p>网络管理域名变更，请参考 <a href="../../../../网络管理/日常维护/change_domain.md">网络管理-变更域名</a></p>
</li>
</ol><h1 id="http">修改蓝鲸入口的 HTTP 访问端口</h1>
<p>蓝鲸默认部署的是 http 协议 + 80 端口的访问，比如 http://paas.bktencent.com 。有些用户因为网络原因，需要修改 80 端口为指定的端口，比如 8089。如果与实际环境产生端口冲突，请自行替换。</p>
<p>本文描述修改默认 http 访问端口的方法。</p>
<ol>
<li>
<p>修改和端口变更相关的变量</p>
<p>```bash
source /data/install/utils.fc</p>
<h1 id="defaultglobalenv-userdefenv">从default/global.env 中复制相关变量到 userdef.env 中然后重定义端口</h1>
<p>cat &lt;<EOF >&gt; $CTRL_DIR/bin/03-userdef/global.env </p>
<h1 id="paas">访问PaaS平台的域名</h1>
<p>BK_PAAS_PUBLIC_URL="http://paas.bktencent.com:8089"
BK_PAAS_PUBLIC_ADDR="paas.bktencent.com:8089"</p>
<h1 id="cmdb">访问CMDB的域名</h1>
<p>BK_CMDB_PUBLIC_ADDR="cmdb.bktencent.com:8089"
BK_CMDB_PUBLIC_URL="http://cmdb.bktencent.com:8089"</p>
<h1 id="job">访问Job平台的域名</h1>
<p>BK_JOB_PUBLIC_ADDR="job.bktencent.com:8089"
BK_JOB_PUBLIC_URL="http://job.bktencent.com:8089"
BK_JOB_API_PUBLIC_ADDR="jobapi.bktencent.com:8089"
BK_JOB_API_PUBLIC_URL="http://jobapi.bktencent.com:8089"
EOF</p>
<p>./bkcli install bkenv
./bkcli sync common</p>
<h1 id="consul">刷新 consul 中存储的值</h1>
<p>consul kv put bkcfg/ports/paas_http 8089
```</p>
</li>
<li>
<p>渲染 PaaS 和 CMDB 配置并重启</p>
<p>```bash
./bkcli render paas
./bkcli restart paas</p>
<p>./bkcli render cmdb
./bkcli restart cmdb
```</p>
</li>
<li>
<p>渲染 JOB 的配置，并重启</p>
<p>```bash</p>
<h1 id="indexhtmlapi">刷新前端index.html调用的api地址</h1>
<p>./pcmd.sh -m nginx '$CTRL_DIR/bin/release_job_frontend.sh -p $BK_HOME -s $BK_PKG_SRC_PATH -B $BK_PKG_SRC_PATH/backup -i $BK_JOB_API_PUBLIC_URL'</p>
<h1 id="jobweburl">刷新job后台的web.url配置，并重启进程</h1>
<p>./bkcli render job
./bkcli restart job
```</p>
</li>
<li>
<p>重新部署 SaaS，从 PaaS 中获取新的 PUBLIC_URL</p>
<p><code>bash
./bkcli install saas-o</code></p>
</li>
</ol><h1 id="_1">修改主机名</h1>
<p>部署蓝鲸之前，建议就确定好主机名，部署蓝鲸的服务器要求主机名不能冲突。</p>
<p>本文描述已经搭建完蓝鲸，需要修改主机名时，应该如何操作:</p>
<ol>
<li>
<p>修改本机的主机名，假设修改为 <code>bk-1</code></p>
<p>```bash
hostnamectl set-hostname bk-1</p>
<h1 id="_2">确认</h1>
<p>hostname 
```</p>
</li>
<li>
<p>修改后，命令行提示符显示的主机名仍是旧的，需要退出终端登录，重新登录一下生效。</p>
</li>
<li>
<p>修改 consul 的 node_name 配置项，和主机名保持一致。（非必须，但是强烈建议保持一致）</p>
<p>```bash
vim /etc/consul.d/consul.json</p>
<h1 id="node_name">编辑 node_name 配置项</h1>
<p>systemctl restart consul
```</p>
</li>
<li>
<p>如果修改主机名的机器是 consul server 的 leader，那么这时会触发 consul 集群的重新选主，需要等待一段时间。</p>
<p>```bash</p>
<h1 id="ctrl-c">持续观察日志输出，按 Ctrl-C中断</h1>
<p>consul monitor </p>
<h1 id="_3">观察是否正常加入集群</h1>
<p>consul members
```</p>
</li>
</ol><h1 id="_1">组件维护</h1>
<h2 id="_2">第三方组件</h2>
<p>第三方依赖组件安装时均使用 rpm 包安装，或者二进制直接拷贝到 $PATH 目录下。下面按照安装顺序依次介绍第三方组件：</p>
<ul>
<li>本地 yum 源：<code>bk-yum.service</code> 部署蓝鲸时临时用的，使用<code>python</code>临时启动的一个 http 下载服务，安装完毕后，应该使用 openresty 来替换它。</li>
<li>consul： <code>consul.service</code> 是 install.config 中配置 consul 模块所在主机启动的 server 角色的 consul 服务。其余机器则为 client 角色。</li>
<li>MySQL： <code>mysql@&lt;实例名&gt;.service</code> Mysql 的安装利用了 systemd service 的模板实例化特性，不同的 mysql 实例的实例名可能不同，服务器上具体安装的名字，可以用 <code>systemctl status mysql@*</code>来查看。</li>
<li>Redis： <code>redis@&lt;实例名&gt;.service</code> Redis 和 Mysql 类似，使用实例化模板启动。</li>
<li>Nginx：<code>openresty.service</code> Nginx 使用的 openresty 的包加上 nginx-upload 模块重新编译打包。操作启停时注意是用 openresty，而不是 nginx。</li>
<li>consul-template： <code>consul-template.service</code> 和 nginx 一并安装的还有 consul-template 的服务，蓝鲸接入层使用它来读取 consul 服务中的动态配置，然后渲染为 nginx 的子配置，渲染成功后，校验 nginx 配置，无误则重新 reload openresty 服务。</li>
<li>RabbitMQ：<code>rabbitmq-server.service</code> RabbitMQ 消息队列服务。被 <code>PaaS</code>、<code>作业平台</code>、<code>官方SaaS</code>依赖。</li>
<li>Zookeeper：<code>zookeeper.service</code> Zookeeper 分布式存储，被 Kafka、<code>配置平台</code>、<code>管控平台</code>依赖。</li>
<li>MongoDB：<code>mongod.service</code> MongoDB 服务，被<code>配置平台</code>、<code>管控平台</code>依赖。</li>
<li>Kafka： <code>kafka.service</code> 被<code>监控平台</code>的数据链路依赖。</li>
<li>Elasticsearch7 <code>elasticsearch.service</code> 被<code>日志平台</code>的数据链路依赖。</li>
<li>InfluxDB：<code>influxdb.service</code> 被<code>监控平台</code> 依赖，存储监控性能数据。</li>
<li>BeanStalk： <code>beanstalkd.service</code> 被 <code>故障自愈</code> 依赖。</li>
</ul>
<h2 id="_3">蓝鲸组件</h2>
<p>下面列举出查看蓝鲸基础平台的模块以及对应的服务名和进程的方法，请注意蓝鲸组件的服务名，均含有 <code>bk-</code> 前缀。服务根据启动先后顺序列出，请格外注意。排在前面的服务一般需要先启动成功后，再启动靠后的服务。</p>
<ol>
<li>证书服务后台：<code>bk-license.service</code></li>
<li>权限中心后台：<code>bk-iam.service</code></li>
<li>凭证管理后台：<code>bk-ssm.service</code></li>
<li>PaaS 后台：<code>bk-paas.target</code></li>
<li>用户管理后台：<code>bk-usermgr.service</code></li>
<li>配置平台后台：<code>bk-cmdb.target</code></li>
<li>bk-cmdb-admin.service： 需要最先启动，将配置文件刷入 zk 节点。</li>
<li>bk-cmdb-core.service： 其次启动，因为剩余的模块会尝试去 zk 上寻找它的 ip:port 发起请求，如果请求失败，会导致进程启动失败。当前版本是一个强依赖。</li>
<li>其他微服务进程启动。</li>
<li>bk-gse-dba.service 应该最先启动，其他进程启动无顺序依赖。</li>
<li>节点管理后台：<code>bk-nodeman.service</code></li>
<li>监控后台：</li>
<li><code>bk-monitor.service：</code> 监控的 kernelapi 后台。</li>
<li><code>bk-transfer.service：</code> 监控链路的 transfer 服务。</li>
<li><code>bk-influxd-proxy.service：</code> 监控读写 influxdb 的代理服务。</li>
<li><code>bk-grafana.service</code> 监控的 grafana 仪表盘服务。</li>
<li>日志平台后台：<code>bk-log-api.service</code></li>
<li>故障自愈后台：<code>bk-fta.service</code></li>
</ol>
<h2 id="_4">组件启停</h2>
<p>组件启停的操作逻辑由 <code>bkcli</code> -&gt; <code>control.sh</code> -&gt; <code>action.rc</code> 这样的调用逻辑控制。例如 <code>bkcli restart paas</code> 解析命令行参数后，调用 <code>control.sh start paas</code>。接着 <code>control.sh</code> 会调用 pssh 登录到每台 paas 机器上，加载 <code>action.rc</code> 后，运行 <code>action_paas start</code> 。 最终底层都是调用 systemctl 命令来做启停。下面主要介绍 systemctl 操作组件的方法。</p>
<h3 id="_5">通用操作</h3>
<p>蓝鲸和开源组件均使用 systemd 来做进程管理。下面列出当前版本注册的 systemd 服务和常用的启停方式。</p>
<p>所有的 service 都支持三种操作：start/stop/restart</p>
<ol>
<li>启动 paas 所有模块：<code>systemctl start bk-paas.target</code></li>
<li>
<p>启动 paas 单个模块：<code>systemctl start bk-paas-&lt;模块名&gt;</code></p>
</li>
<li>
<p>配置了 target 的服务，可以使用 <code>systemctl list-dependencies bk-模块名.target</code> 来看它下面启用的服务有哪些。</p>
<p>如 cmdb 的 target：</p>
<p><code>bash
systemctl list-dependencies bk-cmdb.target
bk-cmdb.target
● ├─bk-cmdb-admin.service
● ├─bk-cmdb-api.service
● ├─bk-cmdb-auth.service
● ├─bk-cmdb-cloud.service
● ├─bk-cmdb-core.service
● ├─bk-cmdb-datacollection.service
● ├─bk-cmdb-event.service
● ├─bk-cmdb-host.service
● ├─bk-cmdb-operation.service
● ├─bk-cmdb-proc.service
● ├─bk-cmdb-task.service
● ├─bk-cmdb-topo.service
● └─bk-cmdb-web.service</code></p>
</li>
<li>
<p>想了解一个服务的 systemd 定义可使用 <code>systemctl cat 服务名</code>。能看到实际的启停命令，需要的环境变量配置等。</p>
</li>
</ol>
<p>如 cmdb 的 admin 服务：</p>
<pre class="codehilite"><code>```bash
systemctl cat bk-cmdb-admin.service
```</code></pre>


<ul>
<li>
<p>如果需要查看服务状态，可以使用 <code>systemctl status 服务名</code>。如果机器负载较高，<code>status</code> 命令可能会因为读取 journalctl 的日志而卡住，可以使用<code>systemctl status 服务名 -n0</code>来跳过日志查看。</p>
</li>
<li>
<p>查看某一台机器上 failed 的 service 情况：<code>systemctl list-units --failed</code> 不过它的输出结果除了蓝鲸组件还包括系统的 systemd 服务，请注意分辨。</p>
</li>
</ul>
<h3 id="_6">组件状态查询</h3>
<p>组件的状态可以从进程运行，健康检测接口返回两个层面进行观察。</p>
<ul>
<li><strong>install/bin/bks.sh：</strong> 脚本用于查询 systemd 管理的进程状态，如果发现 MAINPID 对应的进程名是 supervisord，会进一步通过 supervisorctl 查询 supervisord 托管的子进程的状态。</li>
<li><strong>install/health_check/check_consul_svc_health.sh：</strong> 脚本用于查询注册到 consul 的蓝鲸服务，且具备通过 http 接口探测健康状态。</li>
</ul>
<p>为了便于通过中控机操作，封装了另外 2 个脚本：</p>
<ul>
<li>install/status.sh</li>
<li>install/check.sh</li>
</ul>
<p>分别使用 <code>./bkcli status &lt;模块&gt;</code> 和 <code>./bkcli check &lt;模块&gt;</code> 来调用，根据传入的模块名，ssh 登陆到模块所在的 IP，然后在该 IP 上，运行 bks.sh 和 check_consul_svc_health.sh 的脚本。</p>
<h3 id="_7">启动失败定位</h3>
<p>如果检查状态的时候，发现进程是 failed 状态，需要定位问题，通用的办法如下，下面以 bk-license.service 为例：</p>
<ol>
<li>
<p>通过 journalctl 查看该服务最近的启动日志，观察是否有线索</p>
<p>```bash</p>
<h1 id="bk-license50lesspager">查看bk-license服务的最新的50行日志，直接输出，不传入给less等PAGER</h1>
<p>journalctl -u bk-license.service -n 50 --no-pager
```</p>
</li>
<li>
<p>如果没有可观察到的线索，查看服务的日志，日志目录位于 <code>$BK_HOME/logs/模块名/</code> 下，如果不确定看哪个日志，找到最新的几个观察</p>
<p><code>bash
cd $BK_HOME/logs/license/ &amp;&amp; ls -lrt 
less +F license_serverxxxx.log # +F为了直接看行尾的日志</code></p>
</li>
<li>
<p>如果依然没有找到线索，可以尝试命令行直接启动。因为蓝鲸使用 blueking 账号，应使用 runuser 运行，以便发现权限相关的问题：</p>
<p>```bash</p>
<h1 id="execstart">查看ExecStart使用的命令行，把相关的变量替换为实际的。</h1>
<h1 id="environmentfile">需要注意有一些变量是通过EnvironmentFile=来引用的</h1>
<p>systemctl cat bk-license.service 
runuser -u blueking -- /data/bkce/license/license/bin/license_server -config /data/bkce/etc/license.json
ps -ef | grep license_server
```</p>
</li>
<li>
<p>上一步可能依然没有任何输出，最后的招可以使用 strace 命令观察（需要一定的 Linux 系统调用基础）</p>
<p><code>bash
strace  -f runuser -u blueking -- /data/bkce/license/license/bin/license_server -config /data/bkce/etc/license.json</code></p>
</li>
</ol>
<p>以上是举的 license_server 进程例子，其他进程请根据实际命令和参数来定位。</p>
<h2 id="_8">进程查看</h2>
<p>各组件对应的进程名，启动参数，启动用户，写入的日志文件路径等信息。可以用以下方式查看，本文附表汇总了
基础版的所有组件进程信息，方便对照。见<a href="https://docs.qq.com/sheet/DWkV5elFBemxwY3Nk?tab=BB08J2">《蓝鲸社区版 6.0 进程列表》</a></p>
<ol>
<li>
<p>通览本机所有组件进程，默认是用 <code>more</code> 命令来查看，可以翻页和搜索感兴趣的 service</p>
<p><code>bash
systemctl status</code></p>
</li>
<li>
<p>如果已知 service 的名字，可以直接查看该服务下进程的 MAINPID 找到主进程。</p>
<p><code>bash
systemctl show -p MainPID bk-nodeman.service</code></p>
</li>
<li>
<p>找到 MAINPID 后，可以通过 <code>pstree</code> 查看进程树，包含 pid, cmdline 等信息。</p>
<p><code>bash
pstree -pla &lt;mainpid&gt;</code></p>
</li>
<li>
<p>知道进程的 pid 后，通过 <code>ps</code>、<code>lsof</code>、<code>/proc/&lt;pid&gt;/*</code> 等命令和文件可以了解进程有关的详细信息。</p>
<p>```bash</p>
<h1 id="pid">获取 pid 进程的当前工作目录，顺便查看进程的用户、组。</h1>
<p>ls -l /proc/<pid>/cwd</p>
<h1 id="pid-limits">查看 pid 进程生效的 limits 相关信息：</h1>
<p>cat /proc/<pid>/limits</p>
<h1 id="pid_1">查看 pid 进程生效的环境变量信息：</h1>
<p>tr '\0' '\n' /proc/<pid>/environ</p>
<h1 id="pid_2">查看 pid 打开的普通文件：</h1>
<p>lsof -nP -p <pid> | grep REG </p>
<h1 id="pid_3">查看 pid 监听的端口：</h1>
<p>lsof -Pan -i -sTCP:LISTEN -p <pid>
ss -nlp | grep ,pid=<pid>,
```</p>
</li>
<li>
<p>有些 MAINPID 是 supervisord 的进程，说明这个 service 是 systemd 启动托管 supervisord，supervisord 再拉起相应进程，在蓝鲸基础平台中，一般是 Python 工程会这样使用。</p>
</li>
<li>
<p>部署脚本（<code>./bin/bks.sh</code>）封装了根据 service 名查看进程相关信息的操作，日常使用中可带来便利。</p>
</li>
</ol>
<p>关于进程启动后的 STDOUT 和 STDERR 指向哪里，这里提供一个通用定位方法：</p>
<ol>
<li>
<p>找到 pid 打开的文件句柄 1（STDOUT）和 2（STDERR）。下面以 <code>license_server</code> 为例：</p>
<p><code>bash
$ lsof -p 3518 -a -d 1,2
COMMAND    PID     USER   FD   TYPE             DEVICE SIZE/OFF  NODE NAME
license_s 3518 blueking    1u  unix 0xffff880423539880      0t0 31718 socket
license_s 3518 blueking    2u  unix 0xffff880423539880      0t0 31718 socket</code></p>
</li>
<li>
<p>指向的是 unix socket 类型, NODE 为 31718，使用 ss 查找对应的进程</p>
<p><code>bash
$ ss -xp | grep -w 31718
u_str  ESTAB      0      0       * 31718                 * 15113                 users:(("license_server",pid=3518,fd=2),("license_server",pid=3518,fd=1))
u_str  ESTAB      0      0      /run/systemd/journal/stdout 15113                 * 31718                 users:(("systemd-journal",pid=997,fd=52),("systemd",pid=1,fd=160))</code></p>
<p>可以看出该 unix socket 的对端进程是 systemd-journald。一般使用 systemd 托管的进程，如果没有特殊配置， STDOUT 和 STDERR 都通过 unix socket 发送给 journald 进程然后通过 rsyslogd 的规则，会写入相应的磁盘文件。</p>
</li>
<li>
<p>对于插件进程，比如 <code>basereport</code>，看到 STDERR 是重定向到 /tmp/xuoasefasd.err 文件。</p>
<p><code>bash
$ lsof -c basereport -a -d 1,2
COMMAND     PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
baserepor 21360 root    1w   CHR    1,3      0t0   1028 /dev/null
baserepor 21360 root    2w   REG  252,1        0 399806 /tmp/xuoasefasd.err</code></p>
</li>
<li>
<p>对于 supervisord 托管的进程，且配置文件中配置了 "stdout_logfile" 和 "redirect_stderr" 配置项。那么会显示如下：通过 supervisord 创建的 PIPE pair 打印。</p>
<p>```bash
$ lsof -p 12435 -a -d 1,2
COMMAND    PID     USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
gunicorn 12435 blueking    1w  FIFO    0,8      0t0 427293063 pipe
gunicorn 12435 blueking    2w  FIFO    0,8      0t0 427293063 pipe</p>
<p>$ lsof -n | grep -w 427293063
...
superviso 12422       blueking    8r     FIFO                0,8       0t0  427293063 pipe
...
```</p>
</li>
</ol><h1 id="_1">蓝鲸后台扩容</h1>
<p>蓝鲸后台扩容分为，在已有机器上扩容模块和新增机器扩容模块，区别在是否涉及新机器的初始化。</p>
<p>本文假设待扩容的新机器 IP 为 10.0.0.4 ，且每次只扩容一台。如果扩容多台，请根据实际情况批量执行，或者多次重复执行即可。</p>
<h2 id="_2">新机器初始化</h2>
<ol>
<li>
<p>对中控机配置 ssh 免密登录</p>
<p><code>bash
ssh-copy-id 10.0.0.4</code></p>
</li>
<li>
<p>使用节点管理，在《蓝鲸》业务下，给 10.0.0.4 安装 gse agent。方便通过《蓝鲸》自维护。</p>
</li>
<li>机器初始化。根据初次安装蓝鲸的一些环境要求，和本公司的实际情况，对机器完成初始化。需要注意的是，待扩容机器的主机名不能和原有机器冲突。（这一步不涉及蓝鲸相关的初始化）</li>
<li>修改 install.config 增加扩容的服务器 ip 和对应的模块</li>
<li>
<p>生成更新后的主机变量文件，并同步脚本到所有机器（包括新机器）</p>
<p><code>bash
./bkcli sync common</code></p>
</li>
<li>
<p>同步蓝鲸 repo</p>
<p><code>bash
rsync -av /etc/yum.repos.d/Blueking.repo root@10.0.0.4:/etc/yum.repos.d/</code></p>
</li>
<li>
<p>新机器初始化。</p>
<p><code>bash
pcmd -H 10.0.0.4 /data/install/bin/init_new_node.sh
sleep 10
consul members | grep 10.0.0.4 # 确认新机器加入了consul集群</code></p>
</li>
</ol>
<h2 id="_3">模块扩容</h2>
<p>执行完新节点初始化后，根据不同模块，扩容的方式有所区别。分模块列举如下：</p>
<h3 id="appo">APPO</h3>
<p>APPO 的扩容步骤分为：</p>
<ol>
<li>
<p>同步必要文件</p>
<p><code>bash
./bkcli sync cert 
./bkcli install cert
./bkcli sync appo</code></p>
</li>
<li>
<p>安装并配置 appo 上的 docker</p>
<p><code>bash
pcmd -H 10.0.0.4 '$CTRL_DIR/bin/install_docker_for_paasagent.sh'</code></p>
</li>
<li>
<p>安装 paas_agent</p>
<p><code>bash
pcmd -H 10.0.0.4 '${CTRL_DIR}/bin/install_paasagent.sh -e ${CTRL_DIR}/bin/04-final/paasagent.env -b $LAN_IP -m prod -s ${BK_PKG_SRC_PATH} -p ${INSTALL_PATH}'</code></p>
</li>
<li>
<p>安装 Openresty</p>
<p><code>bash
pcmd -H 10.0.0.4 '${CTRL_DIR}/bin/install_openresty.sh -p ${INSTALL_PATH} -d ${CTRL_DIR}/support-files/templates/nginx/'</code></p>
</li>
<li>
<p>安装 consul-template</p>
<p><code>bash
pcmd -H 10.0.0.4 '${CTRL_DIR}/bin/install_consul_template.sh -m paasagent'</code></p>
</li>
<li>
<p>有 NFS 共享目录时，需要挂载 NFS：</p>
<p><code>bash
ssh 10.0.0.4
source $CTRL_DIR/tools.sh
_mount_shared_nfs appo</code></p>
</li>
</ol>
<h3 id="bkmonitorv3">bkmonitorv3 后台扩容</h3>
<p>扩容的主要步骤如下：</p>
<ol>
<li>
<p>中控机对新增机器配置 ssh 免密登录</p>
<p>```bash</p>
<h1 id="ip">以实际 IP 为准</h1>
<p>ssh-copy-id 10.0.0.4
```</p>
</li>
<li>
<p>使用节点管理，在「蓝鲸」业务下，给新增机器安装 gse agent。</p>
</li>
<li>
<p>在「蓝鲸」业务下，导入监控平台 monitor 扩容标准运维流程。<a href="https://bkopen-1252002024.file.myqcloud.com/ce/bk_sops_scale_monitor_transfer.dat">下载链接</a></p>
</li>
<li>
<p>执行 <code>[common][scale] add blueking node</code> 流程对新增机器进行初始化操作。<code>如果是复用蓝鲸环境的机器，可忽略该步骤</code></p>
</li>
<li>
<p>执行 <code>[bkmonitor][scale]monitor</code> 流程进行监控平台的扩容。</p>
<ul>
<li>ctrl_ip：蓝鲸中控机 IP</li>
<li>refer_ip：扩容参考机 IP (monitor 在的机器，可使用下述命令查看)，和待扩容的 monitor 同类型同集群</li>
</ul>
<p><code>bash
source /data/install/utils.fc &amp;&amp; echo $BK_MONITORV3_IP</code></p>
<ul>
<li>mysql_ip：蓝鲸 MySQL IP 地址。</li>
</ul>
<p>```bash</p>
<h1 id="mysql-mysql">如果 MySQL 使用的是自建数据库，授权需要用户自行处理。自行处理的用户，可使用下述命令获取相关 MySQL 帐户以及密码，然后自行授权，反之请忽略该步骤</h1>
<p>source /data/install/utils.fc</p>
<h1 id="bkmonitorv3_1">bkmonitorv3 账户以及密码</h1>
<p>echo $BK_MONITOR_MYSQL_USER $BK_MONITOR_MYSQL_PASSWORD</p>
<h1 id="paas">paas 账户以及密码</h1>
<p>echo $BK_PAAS_MYSQL_USER $BK_PAAS_MYSQL_PASSWORD
```</p>
<ul>
<li>scale_iplist：扩容 monitor 的机器 IP</li>
</ul>
</li>
<li>
<p>填写并确认参数无误后，开始执行流程。</p>
</li>
<li>
<p>流程执行期间会有暂停步骤，需要手动确认执行。该步骤主要是用户自行检查确认扩容配置，确认访问数据库权限 <code>新增机器上执行</code></p>
<ol>
<li>
<p>检查  <code>/data/bkce/bkmonitorv3/</code> 目录的属组属主是否为 <code>blueking</code></p>
</li>
<li>
<p>检查后台环境变量文件对应 IP 是否替换正确</p>
</li>
</ol>
<p><code>bash
source ~/.bashrc &amp;&amp; grep "$LAN_IP" $BK_HOME/bkmonitorv3/monitor/bin/environ.sh</code></p>
</li>
<li>
<p>上述第 6 步检查无误后，请继续执行流程直至结束。</p>
</li>
<li>
<p>查看【监控平台】-【自监控】后台服务器性能指标是否有新增机器。</p>
<p><img alt="scale_monitor" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/scale_monitor.png" /></p>
</li>
<li>
<p>检查 bkmonitorv3 的 consul 中是否有新增机器的 IP</p>
</li>
</ol>
<pre class="codehilite"><code class="language-bash">dig bkmonitorv3.service.consul</code></pre>


<h3 id="transfer">transfer 扩容</h3>
<p>扩容的主要步骤如下：</p>
<ol>
<li>
<p>中控机对新增机器配置 ssh 免密登录</p>
<p>```bash</p>
<h1 id="ip_1">以实际 IP 为准</h1>
<p>ssh-copy-id 10.0.0.4
```</p>
</li>
<li>
<p>使用节点管理，在「蓝鲸」业务下，给新增机器安装 gse agent。</p>
</li>
<li>
<p>在「蓝鲸」业务下，导入监控平台 transfer 扩容标准运维流程。<a href="https://bkopen-1252002024.file.myqcloud.com/ce/bk_sops_scale_monitor_transfer.dat">下载链接</a></p>
</li>
<li>
<p>执行 <code>[common][scale] add blueking node</code> 流程对新增机器进行初始化操作。<code>如果是复用蓝鲸环境的机器，可忽略该步骤</code></p>
</li>
<li>
<p>执行 <code>[bkmonitor][scale]transfer</code> 流程进行监控平台的扩容。</p>
<ul>
<li>
<p>ctrl_ip：蓝鲸中控机 IP</p>
</li>
<li>
<p>refer_ip：扩容参考机 IP (transfer 在的机器，可使用下述命令查看)，和待扩容的 transfer 同类型同集群</p>
</li>
</ul>
<p><code>bash
source /data/install/utils.fc &amp;&amp; echo $BK_MONITORV3_TRANSFER_IP</code></p>
<ul>
<li>scale_iplist：扩容 transfer 的机器 IP</li>
</ul>
</li>
<li>
<p>填写并确认参数无误后，开始执行流程。</p>
</li>
<li>
<p>流程执行期间会有暂停步骤，需要手动继续执行。该步骤主要是用户自行检查确认扩容配置，确认访问数据库权限 <code>新增机器上执行</code></p>
</li>
<li>
<p>检查  <code>/data/bkce/bkmonitorv3/</code> 目录的属组属主是否为 <code>blueking</code></p>
</li>
<li>
<p>检查 transfer 环境变量文件对应 IP 是否替换正确</p>
<p><code>bash
source ~/.bashrc &amp;&amp; grep "$LAN_IP" $BK_HOME/bkmonitorv3/transfer/transfer.yaml</code></p>
</li>
<li>
<p>上述第 6 步检查无误后，请继续执行流程直至结束。</p>
</li>
<li>
<p>查看【监控平台】-【自监控】transfer 是否有新增机器。</p>
<p><img alt="scale_transfer" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/scale_transfer.png" /></p>
</li>
<li>
<p>检查 transfer 的 consul 中是否有新增机器的 IP</p>
</li>
</ol>
<pre class="codehilite"><code class="language-bash">dig transfer.bkmonitorv3.service.consul</code></pre><h1 id="_1">机器重启</h1>
<p>如果服务器发生了重启，正常情况下组件会由 systemd 自动拉起（因为安装配置了 <code>systemctl enable</code>）。由于组件分布在单台机器上的实际情况较为复杂，并发启动时存在重连次数的限制导致部分进程自启动会有失败的情况。</p>
<p>如果服务器重启后，<code>systemctl list-units --failed</code> 依然有 failed 状态的进程 &lt;输出结果除了蓝鲸组件还包括系统的 systemd 服务，请注意分辨&gt;，可根据它们的依赖关系，重新启动底层服务，确认成功后，再启动蓝鲸组件来解决。以下是几种常见场景：</p>
<ul>
<li>kafka 启动依赖 zookeeper 可用</li>
<li>cmdb 启动依赖 zookeeper 可用</li>
<li>监控链路的 bk-influxdb-proxy 和 bk-transfer 依赖 kafka 可用</li>
</ul>
<h2 id="_2">注意事项</h2>
<p>以往的脚本提供了 <code>stop all</code> 和 <code>start all</code> 的操作，容易引发误操作，日常维护中，并不需要经常做全部服务的停止和启动。对于第三方组件尽量保证它们稳定运行，但是混搭进程的情况下，有时会因为内存不足导致不断 OOM 触发一系列异常。此刻应该按实际情况重启相关进程，避免全部进程重启的粗暴操作。</p>
<h2 id="_3">检查思路</h2>
<h3 id="dns">检查 DNS 配置文件</h3>
<ul>
<li>在部署的 3 台机器上检查 <code>/etc/resolv.conf</code> 文件首行是否存在 <code>nameserver 127.0.0.1</code> 记录。如不存在，请自行加入该文件的首行。</li>
</ul>
<h3 id="_4">检查相关服务</h3>
<pre class="codehilite"><code class="language-bash"># 中控机执行命令
echo bkssm bkiam usermgr paas cmdb gse job consul bklog | xargs -n 1 ./bkcli check</code></pre>


<p>如果 check 输出的状态为非 <code>true</code>，那么可以使用 <code>./bkcli start|restart &lt;module&gt;</code> 拉起。 <strong>module</strong> 为 check 状态非 <code>true</code> 的模块。</p>
<p>假设 paas，job，gse，bkmonitorv3 自启动失败，可以参考下述命令：</p>
<pre class="codehilite"><code class="language-bash"># 中控机执行
echo paas job gse bkmonitorv3 | xargs -n 1 ./bkcli restart

# 如果是模块的某个服务自启动失败，以 gse data 为例
./bkcli restart gse data</code></pre>


<p>job 启动稍微有点慢，可等待 10s~30s 再执行 check 命令。</p>
<p>此外，还可以登录至模块所在的服务器，通过 <code>systemctl start|restart &lt;module&gt;</code> 拉起服务。以 PaaS 为例：</p>
<pre class="codehilite"><code class="language-bash"># 登录 paas 模块所在的机器
source /data/install/utils.fc
ssh $BK_PAAS_IP

# 重启 paas 服务
systemctl restart bk-paas.target</code></pre>


<h3 id="saas">启动蓝鲸所有 SaaS</h3>
<pre class="codehilite"><code class="language-bash">./bkcli start saas-o </code></pre><h1 id="_1">磁盘清理</h1>
<p>可能产生比较大数据量的目录有：</p>
<ul>
<li>
<p>/data/bkce/logs</p>
</li>
<li>
<p>/data/bkce/public</p>
</li>
</ul>
<p>logs 目录可以按需设置自动清理 N 天前的日志。</p>
<p>public 目录一般不能手动删除，一般比较大的组件可能有</p>
<ul>
<li>
<p>MySQL 数据库太大</p>
</li>
<li>
<p>Kafka 数据</p>
</li>
<li>
<p>Elasticsearch 数据</p>
</li>
<li>
<p>MongoDB 数据</p>
</li>
<li>
<p>SaaS 包上传目录</p>
</li>
<li>
<p>作业平台上传文件目录</p>
</li>
</ul>
<h2 id="mysql">MySQL 日志清理</h2>
<p>MySQL 中的 binlog 日志记录了数据库中数据的变动，便于对数据的基于时间点和基于位置的恢复，但是 binlog 也会日渐增大，占用很大的磁盘空间，因此，要对 binlog 使用正确安全的方法清理掉一部分没用的日志。</p>
<blockquote>
<p><strong>注意：</strong> 下述方法仅供参考，具体以实际生产环境情况进行调整。</p>
</blockquote>
<h3 id="binlog">手动清理 binlog</h3>
<p>若社区版设置了多台 MySQL，需查看主库和从库正在使用的 binlog 是哪个文件</p>
<pre class="codehilite"><code class="language-bash">    MySQL [(none)]&gt; show master status\G
    *************************** 1. row ***************************
    File: mysql-bin.000006
    Position: 97013298
    Binlog_Do_DB:
    Binlog_Ignore_DB:
    1 row in set (0.00 sec)

    MySQL [(none)]&gt; show slave status\G
    Empty set (0.00 sec)</code></pre>


<p>删除 binlog 日志之前，对 binlog 进行备份。</p>
<h4 id="binlog_1">清理方法一：删除指定日期以前的日志索引中 binlog 日志文件</h4>
<pre class="codehilite"><code class="language-bash">purge master logs before '201x-xx-xx 00:00:00';</code></pre>


<h4 id="binlog_2">清理方法二：删除指定日志文件的日志索引中 binlog 日志文件</h4>
<pre class="codehilite"><code class="language-bash">purge master logs to'mysql-bin.00000x';</code></pre>


<blockquote>
<p><strong>注意：</strong></p>
<ul>
<li>
<p>时间和文件名一定不可以写错，尤其是时间中的年和文件名中的序号，以防不小心将正在使用的 binlog 删除。</p>
</li>
<li>
<p>切勿删除正在使用的 binlog。</p>
</li>
<li>
<p>使用该语法，会将对应的文件和 mysql-bin.index 中的对应路径删除。</p>
</li>
</ul>
</blockquote>
<h3 id="binlog_3">自动清理 binlog 日志</h3>
<p>使用如下方法查询当前 binlog 的过期时间，若为 0 表示不过期。</p>
<pre class="codehilite"><code class="language-bash">mysql&gt; show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days |   0   |
+------------------+-------+</code></pre>


<p>使用如下方法设置 binlog 过期时间，设置 30 表示 30 天后自动清理之前的过期日志。</p>
<p>该方法只是临时启用，重启 MySQL 服务之后则失效。</p>
<p>永久生效则需将参数添加至 MySQL 配置文件。</p>
<pre class="codehilite"><code class="language-bash">mysql&gt; set global expire_logs_days = 30;</code></pre>


<h2 id="kafka">Kafka 日志清理</h2>
<p>Kafka 将数据持久化到了硬盘上，允许配置一定的策略对数据清理，清理的策略有两个，删除和压缩。</p>
<blockquote>
<p><strong>注意：</strong> 下面清理策略，请根据实际业务，服务器状况，及需求来定制。</p>
</blockquote>
<h3 id="_2">方法一：调整配置文件</h3>
<pre class="codehilite"><code class="language-bash"># 配置文件位置
/etc/kafka/server.properties

# 可以增加 log.cleanup.policy 这个数据清理方式设置，此行为为删除动作
log.cleanup.policy=delete

# 下面有 2 种方式，保留时间或大小，请自行根据实际情况调整此处设置，1G 为 1073741824 。具体保留大小根据实际情况设置
# 注意：下面为直接删除，删除后的消息不可恢复
log.retention.hours=72（超过指定时间 72 小时后，删除旧的消息）
log.retention.bytes=10737418240（超过指定大小 10G 后，删除旧的消息）</code></pre>


<p>设置完毕后，重启服务来生效。</p>
<h3 id="kafka-topic">方法二：Kafka 设置 Topic 过期时间</h3>
<pre class="codehilite"><code class="language-bash"># 设置过期时间，只能用毫秒（retention.ms），或者 bytes（retention.bytes）

[root@kafka ~]# /opt/kafka/bin/kafka-topics.sh --zookeeper zk.service.consul:2181/common_kafka \
--topic 0bkmonitor_10010 --alter --config retention.ms=17280000

WARNING: Altering topic configuration from this script has been deprecated and may be removed in future releases.
         Going forward, please use kafka-configs.sh for this functionality
Updated config for topic &quot;0bkmonitor_10010&quot;.</code></pre>


<h2 id="elasticsearch">Elasticsearch 日志清理</h2>
<ul>
<li>查看目前所有的索引</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
curl -s -u elastic:$BK_ES7_ADMIN_PASSWORD -X GET http://$BK_ES7_IP:9200/_cat/indices?v</code></pre>


<ul>
<li>删除索引</li>
</ul>
<pre class="codehilite"><code class="language-bash"># index 是索引名称
curl -s -u elastic:$BK_ES7_ADMIN_PASSWORD -X DELETE http://$BK_ES7_IP:9200/index</code></pre>


<h2 id="mongodb">MongoDB 数据清理</h2>
<p>CMDB 使用 MongoDB 产生的数据量主要来自 cmdb.cc_OperationLog 这个 collection，它对应的是页面的审计日志查询功能。</p>
<p>需要保留的日期越长，它占用的磁盘空间就越大，可以写脚本定期清理。假设保留时间是 1 年：</p>
<pre class="codehilite"><code class="language-bash"># 待补充</code></pre>


<p>Job 使用 MongoDB 产生的都是作业平台分发文件和执行脚本的日志文件，按天建立的 collection，可以写脚本定期按天来清理 collection。
假设保留时间是 1 年:</p>
<pre class="codehilite"><code class="language-bash">source ./load_env.sh # 加载变量
before_date=$(date -d '1 year ago' +%Y_%m_%d)
# 生成js
cat &lt;&lt;'EOF' &gt; /tmp/delete_job_outdate_collection.js
var fileCollectionNames = db.getCollectionNames().filter(function (collection) { return /^job_log_file/.test(collection) &amp;&amp; collection &lt; &quot;job_log_file_&quot;+beforeDate })
fileCollectionNames.forEach(function(c){print(&quot;dropping:&quot; + c);db[c].drop();})
var scriptCollectionNames = db.getCollectionNames().filter(function (collection) { return /^job_log_script/.test(collection) &amp;&amp; collection &lt; &quot;job_log_script_&quot;+beforeDate })
scriptCollectionNames.forEach(function(c){print(&quot;dropping:&quot; + c);db[c].drop();})
EOF
# 执行清理的js
mongo --quiet &quot;$BK_JOB_LOGSVR_MONGODB_URI&quot; --eval 'var beforeDate=&quot;'$before_date'&quot;' /tmp/delete_job_outdate_collection.js</code></pre>


<h2 id="saas">SaaS 包上传目录</h2>
<p>通过开发者中心部署上传 S-mart 应用包，时间长了以后，会占用一定的磁盘空间，可以配置作业平台任务定时清理。提供示例脚本如下：
第一个参数为 SaaS 包上传目录绝对路径，第二个参数为每个 app_code 对应的包保留的个数（默认为最近 15 个）</p>
<p>需要注意的是，该脚本需要在两个不同的组件服务器上运行：</p>
<ul>
<li>paas 所在服务器的 /data/bkce/open_paas/paas/media/saas_files/ 目录</li>
<li>appo 和 appt 所在服务器的 /data/bkce/paas_agent/saasapp/ 目录</li>
</ul>
<pre class="codehilite"><code class="language-bash">dir=${1}
keep_cnt=${2-:15}
cd $dir || { echo &quot;can't change to $dir&quot;; exit 1; }

app_code=$(ls -rt | grep -Po 'bk_[0-9a-z_]+(?=_V)' | sort | uniq -c  | awk -v keep=$keep_cnt '$1 &gt; keep { print $2 }')
if [[ -z &quot;$app_code&quot; ]]; then
    echo &quot;无需清理&quot;
    exit 0
else
    echo &quot;以下app_code需要清理&quot;
    echo &quot;$app_code&quot;
fi

while read app; do 
    ls ${app}_V*.gz -t | sed &quot;1,${keep_cnt}d&quot; | xargs --no-run-if-empty -I{} sh -c 'ls -l {}; rm -v {};'
done &lt;&lt;&lt;&quot;$app_code&quot;</code></pre>


<h2 id="_3">作业平台上传文件目录</h2>
<p>作业平台长时间使用本地上传文件，文件存储目录 <code>/data/bkce/public/job/localupload</code> 会持续增长，job 后台默认会每小时自动清理超过 7 天的未被任何
作业引用的本地上传文件（一般是快速分发文件功能落地的），如果本地上传的文件，有被任意作业引用，则即使超过 7 天也不会被自动删除。</p><h1 id="_1">组件更新</h1>
<h2 id="_2">概述</h2>
<h3 id="_3">更新注意事项</h3>
<ol>
<li>
<p>Python 工程涉及到安装新的 requirement.txt 的中涉及的依赖 pip 包，如果更新过程中报错，可能由于某些系统 devel 包不匹配导致，这时需要根据实际情况，修复该问题后，重新执行更新指令。</p>
</li>
<li>
<p>部分模块的 support-files/sql/ 目录下有更新 sql 文件的，需要注意 sql 是否正常执行，如果中途报错，需要解决 sql 变更的问题再继续。</p>
</li>
<li>
<p>部分模块 support-files/bkiam/ 目录下有更新 json 文件的，需要注意 bkiam migration 是否执行成功，如果中途报错，需要解决权限模型注册的问题再继续。</p>
</li>
</ol>
<h3 id="_4">后台组件更新的通用步骤如下</h3>
<p>以 CMDB 为例：</p>
<ol>
<li>获取 CMDB 更新包。</li>
<li>在中控机备份原有 src/cmdb 目录，然后删除 src/cmdb，并解压最新版本到 src 目录下。删除原来的目录是为了保证 src/cmdb 不残留无用的文件。</li>
<li>如果有自定义修改的配置模板/第三方扩展代码目录，可以同时同步到 src/cmdb/ 下。</li>
<li>运行 <code>./bkcli upgrade cmdb</code></li>
<li>将 src/*/VERSION 的版本号刷新到 MySQL 库中存储版本信息的表中：<code>source ./tools.sh; _update_common_info</code></li>
</ol>
<h3 id="saas">SaaS 的更新通用步骤有两种方式</h3>
<ol>
<li>
<p>页面更新：登陆 PaaS 平台 -&gt; 开发者中心 -&gt; S-mart 应用 -&gt; 找到待更新的 SaaS 应用名 -&gt; 上传版本 -&gt; 发布部署 -&gt; 选择对应的环境和版本 -&gt; 部署</p>
</li>
<li>
<p>后台命令行更新，其中 app_code 请替换为具体对应的 SaaS，比如更新标准运维，使用 bk_sops：</p>
</li>
<li>
<p>上传 SaaS 包到中控机的 /data/src/official_saas/ 目录</p>
</li>
<li>
<p>更新正式环境运行命令 <code>cd /data/install &amp;&amp; ./bkcli install saas-o app_code</code></p>
</li>
<li>
<p>更新测试环境运行命令 <code>cd /data/install &amp;&amp; ./bkcli install saas-t app_code</code></p>
</li>
</ol>
<h3 id="paas">PaaS 更新</h3>
<p>PaaS 更新需要注意处理第三方扩展代码目录。如：改造过企业内部统一登录。则需要将原来的数据拷贝回原来的目录下</p>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade paas </code></pre>


<h3 id="paas-agent">PaaS Agent 更新</h3>
<p>PaaS Agent 分为 appo 和 appt，更新场景主要包括三个方面：</p>
<ol>
<li>
<p>src/image/ 的更新。SaaS 所用的基础镜像更新，比较简单，直接使用 <code>docker load</code> 加载新的镜像即可。</p>
</li>
<li>
<p>paas_agent 目录的二进制和脚本更新，直接使用 rsync 同步 paas_agent/ 目录到安装目录下的 paas_agent/ 然后重启进程即可</p>
</li>
<li>
<p>openresty 的配置模板更新，需要更新 /etc/consul-template/templates/ 下的模版配置文件</p>
</li>
</ol>
<h3 id="cmdb">CMDB 更新</h3>
<p>原则上 CMDB 不停机更新需要滚动更新，包括 cmdb-api、cmdb-web、cmdb-auth 三个模块的需要先从 Nginx 上剔除，然后更新对应模块。</p>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade cmdb</code></pre>


<h3 id="gse">GSE 更新</h3>
<p>gse 分为 server 端和 client 端的更新。 Server 端更新和常规通用更新一样。Client 端更新有点特殊，（注意拿到 gse 的更新包后，不要删除原始的 tgz 包。）分两步：</p>
<h4 id="server">server 端更新</h4>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade gse</code></pre>


<h4 id="client">client 端更新</h4>
<ol>
<li>打包 client 包，<code>-o</code> 指定生成 gse_client 包的目录。</li>
</ol>
<p><code>bash
   /data/install/bin/pack_gse_client_with_plugin.sh -c /data/bkce/cert \
     -f /data/src/gse_xxx.tgz -p /data/src/gse_plugins/ -o /tmp/gse</code></p>
<ol>
<li>将生成的 client 包拷贝到节点管理后台机器的 http 下载服务目录下</li>
</ol>
<p><code>bash
   chown blueking.blueking /tmp/gse/*.tgz
   rsync -v /tmp/gse/*.tgz $BK_NODEMAN_IP:$BK_HOME/public/bknodeman/download/</code></p>
<h3 id="job">Job 更新</h3>
<p>Job 是前后端分离的部署架构，前后端分开更新，分别使用 <code>bin/release_job_frontend.sh</code> 和 <code>bin/release_job_backend.sh</code>，但经过 <code>upgrade.sh</code> 脚本封装后，可以直接使用常规通用的来实现更新。</p>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade job</code></pre>


<h3 id="_5">节点管理更新</h3>
<p>节点管理分前后台，SaaS 的 app_code 为 <code>bk_nodeman</code>，后台的模块是 <code>bknodeman</code>。它们公用一个 bk_nodeman 的数据库，而数据库的 schema 更新维护是在 SaaS 中完成，权限模型的更新也由 SaaS 控制。所以如果有更新，每次先更新 SaaS，然后更新后台。</p>
<pre class="codehilite"><code class="language-bash"># 更新 SaaS。前提是已将 bk_nodeman 的 SaaS 包放置 src/official_saas/ 下
./bkcli install saas-o bk_nodeman

# 更新后台
./bkcli upgrade bknodeman</code></pre>


<h3 id="_6">监控平台更新</h3>
<p>监控平台区分了 2 个数据库，一个是 <code>bk_monitorv3</code>，一个是 <code>bkmonitorv3_alert</code>，SaaS 和后台都会读写这 2 个库。SaaS 的 app_code 是 bk_monitorv3，后台模块是 bkmonitorv3。更新时，需要先更新 SaaS，数据库的 schema 更新维护是在 SaaS 完成，权限模型的更新也由 SaaS 控制。每次先更新 SaaS，然后更新后台。</p>
<pre class="codehilite"><code class="language-bash"># 更新 SaaS。前提是已将 bk_monitorv3 的 SaaS 包放置 src/official_saas/ 下
./bkcli install saas-o bk_monitorv3

# 更新后台
./bkcli upgrade bkmonitorv3</code></pre>


<h3 id="_7">日志平台更新</h3>
<p>日志平台 SaaS 的 app_code 是 bk_log_search，后台模块是 bklog。数据库的 schema 更新维护是在 SaaS 完成，权限模型的更新也由 SaaS 控制。每次先更新 SaaS，然后更新后台。</p>
<pre class="codehilite"><code class="language-bash"># 更新 SaaS。前提是已将 bk_log_search 的 SaaS 包放置 src/official_saas/ 下
./bkcli install saas-o bk_log_search

# 更新后台
./bkcli upgrade bklog</code></pre><h1 id="_1">更新证书</h1>
<blockquote>
<p>有时候 GSE 和 License 所在服务器的 MAC 地址发生了变化，此时证书需要重新下载，然后操作更新证书的步骤</p>
</blockquote>
<h2 id="_2">中控机上解压新的证书</h2>
<pre class="codehilite"><code class="language-bash">cd /data/src/cert &amp;&amp; rm -f *
tar -xvf /data/ssl_certificates.tar.gz -C /data/src/cert/</code></pre>


<h2 id="_3">中控机执行更新证书动作</h2>
<blockquote>
<p>该动作将会重启 license、gse、job，请酌情操作</p>
</blockquote>
<pre class="codehilite"><code class="language-bash">cd /data/install
./bkcli upgrade cert</code></pre>


<p><code>Proxy</code> 和 <code>Agent</code> 已实现免证书更新，不需执行任何操作。</p><h1 id="_1">蓝鲸自监控指引</h1>
<p>本文描述蓝鲸平台自身的组件监控，应该配置哪些基础的采集，告警策略以便能主动识别和提早发现问题。
具体实施落地，可以使用蓝鲸监控自身配置，也可以使用第三方的监控告警工具。</p>
<p>本文主要以使用蓝鲸配置平台和监控平台来完成自监控的配置。</p>
<h2 id="_2">配置信息梳理</h2>
<p>在搭建部署文档的最后，有提示需要使用 <code>./bkcli initdata topo</code> 命令来自动创建《蓝鲸》业务下的集群模块拓扑结构。
并将服务器 ip 自动转移到对应的集群模块下，并自动应用了服务模板里配置的服务实例，包含了进程端口的配置。</p>
<p>在日常运维中，对蓝鲸后台服务器分布如果做了变更，包括扩容、缩容，大版本升级等。相应的集群模块和主机关系发生变动
需要及时更新配置平台信息，保障基础信息的准确性。</p>
<p>主机的负责人、备份负责人，也应该梳理清楚，相应人员的 Email、 手机号等通知渠道信息尽量准确。在使用蓝鲸监控告警通知时才能成功发送。</p>
<h2 id="_3">主机类</h2>
<p>服务器主机的基础性能和异常告警，是最基础的配置，“蓝鲸监控” 开箱即启用了基础性能的默认策略。现列出实践中对《蓝鲸》业务下主机开启的主机
告警策略如下：</p>
<ul>
<li>Ping 不可达告警</li>
<li>主机重启</li>
<li>单机性能告警（5 分钟平均负载 &gt; 16，5 个周期内发生 3 次）</li>
<li>Corefile 产生</li>
<li>磁盘只读</li>
<li>Agent 心跳丢失</li>
<li>CPU 总使用率(&gt;95%，5 个周期内发生 3 次)</li>
<li>磁盘 I/O 使用率(&gt;85%，5 个周期内发生 3 次)</li>
<li>应用内存使用率(&gt;95%，5 个周期内发生 3 次)</li>
<li>磁盘空间使用率(&gt;95%)</li>
<li>磁盘 inode 使用率告警(&gt;98%)</li>
<li>OOM 异常告警</li>
</ul>
<h2 id="_4">进程类</h2>
<p>进程需要维护好 CMDB 上的进程端口配置，然后开启默认的进程端口不存在告警即可（依赖 processbeat 插件的正常运行）</p>
<h2 id="_5">第三方组件应用指标</h2>
<h3 id="elasticsearch">Elasticsearch</h3>
<p>使用官方自带采集器指标，配置监控</p>
<ul>
<li>elasticsearch_cluster_health_status（集群状态 yellow, red, green, 如果不是 green 则告警）</li>
<li>elasticsearch_thread_pool_queue_count（线程队列堆积数 &gt; 200）</li>
</ul>
<h3 id="rabbitmq">RabbitMQ</h3>
<p>使用官方自带采集器指标，配置监控</p>
<ul>
<li>rabbitmq_queue_messages_ready_total （&gt;20000，5 周期内发生 3 次）</li>
</ul>
<h2 id="_6">蓝鲸组件应用指标</h2>
<p>蓝鲸的关键服务均通过 consul 服务注册，平时可以配置好 Consul 的 WebUI 来查看服务的情况。如果需要使用监控，当有服务异常时发送告警
可以采取自定义事件上报的方式来做监控。对于自定义上报功能，详细介绍参考监控平台白皮书中<a href="https://bk.tencent.com/docs/document/6.0/134/6177">自定义上报工具</a></p>
<p>最新的部署脚本里写了四个示例的自定义上报脚本：</p>
<ul>
<li>./monitor/cmdb_healthz.sh</li>
<li>./monitor/consul_healthz.sh</li>
<li>./monitor/job_healthz.sh</li>
<li>./monitor/saas_healthz.sh</li>
</ul>
<p>其中 cmdb_healthz、job_healthz.sh 需要在每台部署了 cmdb 和 job 的服务器配置 crontab 运行。
consul_healthz.sh 只用在中控机部署 crontab 运行。
saas_healthz 只用在任意一台 appo 上部署 crontab 运行。配置的 crontab 项实例如下：</p>
<pre class="codehilite"><code class="language-bash"># 蓝鲸监控healthz脚本告警
* * * * * sleep 7; /data/install/monitor/consul_healthz.sh &lt;自定义上报数据ID&gt; &lt;自定义上报token&gt; &lt;自定义上报的地址url&gt; &lt;环境标签&gt;</code></pre>


<p>PaaS 平台 esb 组件的接口调用日志错误条数，可以纳入监控。</p>
<ol>
<li>配置日志采集，将 nginx 模块下的 paas_api_error.log 日志采集入库</li>
<li>监控上配置采集项的日志条数告警，大于 1，则告警。因为正常情况下，该 error 日志不应该出现任何日志。</li>
</ol><h1 id="db">DB 日常备份</h1>
<ul>
<li>该备份策略适合于日常的数据备份，升级蓝鲸时需重新进行备份操作。</li>
<li>远程备份可放在 NFS 或者 HDFS 来保存。</li>
<li>支持手工执行相应脚本备份，业务空闲期。</li>
<li>目前支持 MySQL、MongoDB、Redis、InfluxDB 数据库的本地全备。</li>
<li>该备份策略默认在每天凌晨 3 点开始备份。如需修改，请自行修改 crontab 定时任务。</li>
<li>备份文件统一存放于 /data/src/backup/dbbak。为保险起见，可遵循备份 3-2-1 法则。</li>
<li>备份数据默认保留 3 天。如需修改，请自行修改 /data/src/backup/dbbak/*.conf 的 <code>oldfileleftday</code> 的值。</li>
</ul>
<h2 id="_1">备份部署</h2>
<p>部署备份分四种情况：</p>
<p>1.第一次初始化 (中控机)</p>
<pre class="codehilite"><code class="language-bash"># 中控机执行
source /data/install/utils.fc
ssh root@$BK_MYSQL_IP0 &quot;$CTRL_DIR/storage/dbbackup/dbbackup_init.sh blueking mysql&quot;
ssh root@$BK_MONGODB_IP0 &quot;$CTRL_DIR/storage/dbbackup/dbbackup_init.sh blueking mongodb&quot;</code></pre>


<p>2.故障替换机器 (新机器)</p>
<p>通过 <code>/data/install/install.config</code> 涉及对应的 DB 类型机器，进行相应 db 版本部署，如 MySQL，其它类型类似。</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
bash $CTRL_DIR/storage/dbbackup/dbbackup_init.sh blueking mysql</code></pre>


<p>3.故障机器恢复再使用，不用部署。</p>
<p>4.同类型数据库在一台机器上部署了多实例的情况。例如：MySQL 在一台机器上启动两个实例 3306 和 3307 端口，备份只需要做如下配置，其它类型 DB 可以参考：</p>
<pre class="codehilite"><code class="language-bash">cat &gt; /data/src/backup/dbbak/dbbackup_mysql_3307.conf &lt;&lt; EOF

[blueking]
productname=bkee
charset=utf8
cmdpath=/usr/bin
host=本地IP
port=3307
user=root
dataorgrant=all
role=master
backupdir=/data/src/backup/dbbak
dbtype=mysql
oldfileleftday=3
ignoredblist=information_schema mysql test db_infobase performance_schema sys

EOF</code></pre>


<p>5.手工发起备份。
dbtype 可支持 MySQL | MongoDB | Redis | InfluxDB</p>
<pre class="codehilite"><code class="language-bash"># ${dbtype} 请使用实际的数据库类型进行替换
source /data/install/utils.fc
nohup bash /data/src/backup/dbbak/dbbackup_mysql.sh /data/src/backup/dbbak/dbbackup_mysql.conf blueking &amp; </code></pre>


<h2 id="_2">定点恢复</h2>
<p>完整的全备和增量备份的情况下，数据库可以恢复到任意时间点。</p>
<p><strong>恢复全备和增量备份时对应的应用需要停止，规避数据冲突和不可逆转的问题</strong>
<strong>做任意恢复前一定要先做好备份</strong></p>
<h3 id="mysql">MySQL(全备 &amp; 增量恢复)</h3>
<ul>
<li>全备恢复（在 MySQL 主机上执行）</li>
</ul>
<p>```bash
   # 登陆至 MySQL 机器
   source /data/install/utils.fc
   ssh $BK_MYSQL_IP</p>
<p># 导入数据
   tar -xvf mysql-blueking-10.0.0.1-3306-xxxxxx.sql.tar.gz
   nohup gunzip &lt; mysql-blueking-10.0.0.1-3306-xxxxx.sql.tar.gz |mysql --login-path=default-root 2&gt;err.log &amp;
   ```</p>
<ul>
<li>
<p>增量 BINLOG 恢复，恢复至指定时间点</p>
</li>
<li>
<p>找出全备对应的 BINLOG 起始文件(CHANGE MASTER TO 那一行)</p>
<p><code>bash
  zcat mysql-blueking-10.0.0.1-3306-xxxxx.sql | head -100</code></p>
</li>
<li>
<p>找出最后恢复时间点的 BINLOG 文件</p>
<p>```bash
  cd  /data/bkce/public/mysql/default/binlog</p>
<p>for i in <code>seq -w 000001 000012</code>; do
    mysqlbinlog mysql-bin.0000$i | mysql --login-path=default-root &gt;&gt; restore.sql
  done
  ```</p>
<p>恢复临近 mysql-bin.000012 指定时间点(即可恢复到的时间点)</p>
<p><code>bash
  mysqlbinlog -–stop-datetime="2020-12-28 11:25:56" mysql-bin.000012 |mysql --login-path=default-root &gt;&gt; restore.sql</code></p>
</li>
<li>
<p>导入 BINLOG</p>
<p><code>bash
  nohup mysql --login-path=default-root &lt;restore.sql 2&gt;err.log</code></p>
</li>
</ul>
<h4 id="mongodb">MongoDB(全量&amp;增量恢复)</h4>
<ul>
<li>全备恢复</li>
</ul>
<p>备份方式不一样，恢复的命令不一样，这里以蓝鲸的备份方式来进行恢复：(以 cmdb 为例)</p>
<pre class="codehilite"><code class="language-bash">mongorestore -h $BK_CMDB_MONGODB_HOST:$BK_CMDB_MONGODB_PORT  -u $BK_CMDB_MONGODB_USERNAME -p $BK_CMDB_MONGODB_PASSWORD  --dir=/data/src/backup/dbbak/mongodb_xxxxxxx/cmdb --gzip --db cmdb</code></pre><h1 id="proxy">开启 Proxy</h1>
<p>蓝鲸部署默认不开启 Proxy，因为部分用户存在跨云管控需求，而实现跨云管控需要安装 proxy 。</p>
<p>本文描述，开启 proxy 的方法，文章所涉及路径均为蓝鲸默认，如果出入，请以实际为准：</p>
<h2 id="_1">部署前</h2>
<ul>
<li>登陆节点管理机器，将 nodeman 模块所在机器的外网 IP 写入指定文件。</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机执行
source /data/install/utils.fc
ssh $BK_NODEMAN_IP

# 将节点管理机器外网 IP 写入指定文件
echo WAN_IP=$(curl -s icanhazip.com) &gt;&gt; /etc/blueking/env/local.env</code></pre>


<ul>
<li>
<p>将 gse 模块所在机器的外网 IP 写入至中控机指定的文件</p>
<p>需要将 gse 外网写入至中控机指定文件，主要是为了解决 proxy 机器与 gse 机器的网络不通，导致无法与 gse 建立相关连接，因为未指定 gse 外网 IP 时，默认为 gse 的内网 IP。</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机执行
ssh $BK_GSE_IP
echo BK_GSE_WAN_IP_LIST=$(curl -s icanhazip.com) &gt;&gt; /etc/blueking/env/local.env</code></pre>


<ul>
<li>将 gse 的 bt 模块监听 0.0.0.0 (6.0.4 之前版本需要此步骤)</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机执行
sed -i '/filesvrthriftip/s/__LAN_IP__/0.0.0.0/' /data/src/gse/support-files/templates/#etc#gse#btsvr.conf</code></pre>


<h2 id="_2">部署后</h2>
<ul>
<li>登陆节点管理机器，将 nodeman 模块所在机器的外网 IP 写入指定文件。</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 中控机执行
source /data/install/utils.fc
ssh $BK_NODEMAN_IP

# 将节点管理机器外网 IP 写入指定文件
echo WAN_IP=$(curl -s icanhazip.com) &gt;&gt; /etc/blueking/env/local.env</code></pre>


<ul>
<li>注册 bkcfg/global/nodeman_wan_ip 至 consul</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
consul kv put bkcfg/global/nodeman_wan_ip $WAN_IP</code></pre>


<ul>
<li>重启 consul-template 关服务</li>
</ul>
<pre class="codehilite"><code class="language-bash">systemctl restart consul-template</code></pre>


<ul>
<li>
<p>进入节点管理 SaaS，修改 gse 的全局配置 (该方式主要是为了解决 gse 与 proxy 内网不通时，如内网能通，请忽略该步骤)</p>
</li>
<li>
<p>打开节点管理</p>
</li>
<li>
<p>进入 【全局配置】，编辑【默认接入点】</p>
</li>
<li>
<p>修改 <code>Btfileserver</code>、<code>Dataserver</code>、<code>Taskserver</code> 的 <code>外网IP列</code> 为实际的 GSE 外网 IP [gse 模块分布的机器]，可参考 <code>$CTRL_DIR/pcmd.sh -m gse "curl -s icanhazip.com" | tail -n 1</code>。</p>
</li>
<li>
<p>修改 <code>Agent包 URL</code> 第二个输入框的域名，替换为节点管理的外网 IP [nodeman 模块分布的机器]，可参考 <code>$CTRL_DIR/pcmd.sh -m nodeman "curl -s icanhazip.com" | tail -n 1</code></p>
<p><img alt="nodeman_global_setting" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/nodeman_global_setting.png" /></p>
</li>
<li>
<p>重新渲染配置</p>
</li>
</ul>
<p>渲染配置可以选择重装或者重新渲染配置文件的方式。</p>
<pre class="codehilite"><code class="language-bash">./bkcli render bknodeman</code></pre>


<ul>
<li>重启节点管理进程</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcli restart bknodeman</code></pre><h1 id="http-https">HTTP 切换 HTTPS</h1>
<ol>
<li>
<p>中控机生成 $BK_DOMAIN 的自签名通配符证书（可选），如果有外部签发的合法证书，可拷贝改名到 $BK_PKG_SRC_PATH/cert/bk_domain.{crt,key} 两个文件。文件名的修改是为了匹配 nginx 模板默认名。</p>
<p>```bash
source /data/install/utils.fc</p>
<h1 id="openssl">注意：openssl 这是一行命令</h1>
<p>openssl req -x509 -days 365 -out $BK_PKG_SRC_PATH/cert/bk_domain.crt -keyout   $BK_PKG_SRC_PATH/cert/bk_domain.key \
-newkey rsa:2048 -nodes -sha256 \
-subj "/CN=<em>.$BK_DOMAIN" -extensions EXT -config &lt;( \
printf "[dn]\nCN=</em>.$BK_DOMAIN\n[req]\ndistinguished_name = dn\n[EXT]\nsubjectAltName=DNS:*.$BK_DOMAIN\nkeyUsage=digitalSignature\nextendedKeyUsage=serverAuth")
```</p>
</li>
<li>
<p>同步并安装证书</p>
<p><code>bash
./bkcli sync cert
./bkcli install cert</code></p>
</li>
<li>
<p>将 BK_HTTP_SCHEMA 修改为 https，同时修改 JOB 的前端 API 地址。然后刷新 consul 中存储的键值，以及重新渲染 JOB 的前端页面。</p>
<p>```bash
source /data/install/utils.fc
cd $CTRL_DIR</p>
<h1 id="globalenv-urladdrhttps80443">自定义 global.env 配置相关URL和ADDR变量的变更，因为涉及到https切换，80端口也需要改为443</h1>
<p>cat &lt;<EOF >&gt; $CTRL_DIR/bin/03-userdef/global.env 
BK_HTTP_SCHEMA=https</p>
<h1 id="paas">访问PaaS平台的域名</h1>
<p>BK_PAAS_PUBLIC_URL="https://paas.bktencent.com"
BK_PAAS_PUBLIC_ADDR="paas.bktencent.com:443"
BK_PAAS_PRIVATE_ADDR="paas.service.consul:80"
BK_PAAS_PRIVATE_URL="http://paas.service.consul"</p>
<h1 id="cmdb">访问CMDB的域名</h1>
<p>BK_CMDB_PUBLIC_ADDR="cmdb.bktencent.com:443"
BK_CMDB_PUBLIC_URL="https://cmdb.bktencent.com"</p>
<h1 id="job">访问Job平台的域名</h1>
<p>BK_JOB_PUBLIC_ADDR="job.bktencent.com:443"
BK_JOB_PUBLIC_URL="https://job.bktencent.com"
BK_JOB_API_PUBLIC_ADDR="jobapi.bktencent.com:443"
BK_JOB_API_PUBLIC_URL="https://jobapi.bktencent.com"</p>
<h1 id="url">访问节点管理下载插件包的URL前缀</h1>
<p>BK_NODEMAN_PUBLIC_DOWNLOAD_URL="https://nodeman.bktencent.com:443"</p>
<h1 id="lesscode">lesscode 域名</h1>
<p>BK_LESSCODE_PUBLIC_ADDR='lesscode.bktencent.com:443'
BK_LESSCODE_PUBLIC_URL='https://lesscode.bktencent.com:443'</p>
<p>EOF</p>
<p>./bkcli install bkenv
./bkcli sync common</p>
<h1 id="consul">刷新 consul 中存储的值</h1>
<p>consul kv put bkcfg/global/bk_http_schema https
```</p>
</li>
<li>
<p>渲染 PaaS 和 CMDB 配置并重启</p>
<p>```bash
./bkcli render paas
./bkcli restart paas</p>
<p>./bkcli render cmdb
./bkcli restart cmdb
```</p>
</li>
<li>
<p>渲染 job 的配置，并重启</p>
<p>```bash</p>
<h1 id="indexhtmlapi">刷新前端index.html调用的api地址</h1>
<p>./pcmd.sh -m nginx '$CTRL_DIR/bin/release_job_frontend.sh -p $BK_HOME -s $BK_PKG_SRC_PATH -B $BK_PKG_SRC_PATH/backup -i $BK_JOB_API_PUBLIC_URL'</p>
<h1 id="jobweburl">刷新job后台的web.url配置，并重启进程</h1>
<p>./bkcli render job
./bkcli restart job
```</p>
</li>
<li>
<p>刷新 lesscode url
    ```bash
    lesscode 模块所在服务器，nginx模板文件插入 https 配置 /etc/consul-template/templates/lesscode.conf
    {{ if key "bkcfg/global/bk_http_schema" | regexMatch "^https$" }}
        ### ssl config begin ###
        listen {{ key "bkcfg/ports/paas_https" }}  ssl;
        include /usr/local/openresty/nginx/conf/bk.ssl;
        # force https-redirects
        if ($scheme = http) {
            return 301 https://$server_name$request_uri;
        }
        ### ssl config end ###
    {{ end }}</p>
<p>./pcmd.sh -m lesscode "bash /data/install/bin/bk-lesscode-reg-paas-app.sh"
./pcmd.sh -m nginx "systemctl reload openresty.service"
```</p>
</li>
<li>
<p>重新部署 SaaS，从 PaaS 中获取新的 BK_HTTP_SCHEMA (https)</p>
<p><code>bash
./bkcli install saas-o</code></p>
</li>
</ol><h1 id="gse-agent">GSE Agent 非标准安装方案</h1>
<p>蓝鲸官方自带的节点管理提供了标准安装蓝鲸 agent 及其插件管理的功能。在某些特殊场景下，可以使用非标准的安装方案来达到自动化部署 agent 的目的。</p>
<p>本文主要阐述不使用节点管理批量安装 agent 的通用思路，用户需要结合实际部署场景，灵活使用。</p>
<h2 id="_1">前提</h2>
<p>无论安装直连 agent，还是跨云区域的 agent，请先阅读节点管理的产品功能白皮书，了解相关概念，并使用节点管理成功安装一台主机。</p>
<p>本文档只描述，成功安装一台主机后，如何不通过节点管理，批量复制安装到其他机器（相同操作系统，相同 CPU 架构），然后注册到配置平台，进行纳管。</p>
<p>假设成功安装的直连区域主机 ip 为 10.0.0.1，安装路径为 <code>/usr/local/gse/</code>，运行和日志目录为默认的 <code>/var/run/gse</code>、<code>/var/lib/gse</code>、<code>/var/log/gse</code></p>
<p>用户已经有现成的简易批量主机传输文件/命令执行工具（ansible、pssh 等），因为节点管理安装 agent 的核心也是 SSH 协议来批量执行命令。
那么就是假设用户已经有其他方式实现该能力。</p>
<h2 id="linux">Linux 系统安装</h2>
<ol>
<li>
<p>登录到 10.0.0.1 机器，打包安装成功的 agent 目录：</p>
<p><code>bash
cd /usr/local/gse &amp;&amp; tar -czf /tmp/gse_client.tgz --exclude="*.pid" agent/ plugins/bin/*.sh</code></p>
</li>
<li>
<p>将/tmp/gse_client.tgz 分发到 待安装的目标机器的 /tmp 目录下。</p>
</li>
<li>在待安装的目标机器上创建必要目录后，解压客户端包：</li>
</ol>
<p><code>bash
   install -d /var/run/gse /var/lib/gse /var/log/gse /usr/local/gse
   tar -xf /tmp/gse_client.tgz -C /usr/local/gse</code></p>
<ol>
<li>
<p>确认目标机器需要注册到配置平台的内网 IP 地址以及本机的网卡地址，这里涉及到 agent.conf 配置文件的修改。大多数情况下这两个 ip 地址都是一样的。</p>
<ul>
<li>注册到配置平台的内网 ip 地址($display_ip)：日后在蓝鲸平台上，无论是作业平台，还是监控平台，都会用该 ip 地址来指代这台主机。</li>
<li>本机网卡地址($agent_ip)：通过 <code>ip addr</code> 命令能看到的 ip 地址</li>
</ul>
<p><code>bash
display_ip=10.0.0.2 # 请根据实际情况写命令自动获取
agent_ip=10.0.0.2   # 请根据实际情况写命令自动获取
sed -i '/"identityip"/c\    "identityip": "'$display_ip'",' /usr/local/gse/agent/etc/agent.conf
sed -i '/"agentip"/c\    "agentip": "'$agent_ip'",' /usr/local/gse/agent/etc/agent.conf</code></p>
</li>
<li>
<p>确认第四步修改正常后，特别是 json 语法，确认是否符合。</p>
<p><code>bash
python -m json.tool &lt; /usr/local/gse/agent/etc/agent.conf &gt;/dev/null &amp;&amp; echo OK || echo FAIL</code></p>
</li>
<li>
<p>启动 agent</p>
<p><code>bash
/usr/local/gse/agent/bin/gsectl start</code></p>
</li>
<li>
<p>确认 agent 启动正常，并和 gse server 成功建立连接</p>
<p>```bash</p>
<h1 id="gse-agentmaster-pidchild-pid">获取gse-agent的master pid和child pid</h1>
<p>pid=$(&lt; /usr/local/gse/agent/bin/run/agent.pid )
c_pid=$(pgrep -P $pid)</p>
<h1 id="master-pidchild-pid">根据 master pid，和child pid，并打印出启动时间和命令行参数，以下命令输出应该等于三行。</h1>
<p>ps -p $pid,$c_pid -o pid,lstart,args</p>
<h1 id="workerpidlistenestablished4853358625">确认建立了连接（worker的pid负责建立连接），应该有一个LISTEN，两个ESTABLISHED（48533和58625）</h1>
<p>netstat -antp | awk -v pid=$c_pid '$NF ~ pid' 
```</p>
</li>
<li>
<p>配置开机启动，根据实际的操作系统，添加到合适的位置。以 centos7 为例，添加到 /etc/rc.d/rc.local，并给它添加可执行权限。</p>
<p><code>bash
sed -i ',/usr/local/gse/agent/bin/gsectl,d' /etc/rc.d/rc.local
echo '[ -x /usr/local/gse/agent/bin/gsectl ] &amp;&amp; /usr/local/gse/agent/bin/gsectl start' &gt;&gt; /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local</code></p>
</li>
</ol>
<p>用户根据实际情况将上述步骤，编写脚本来处理批量初始化安装 gse agent，或者在操作系统初始化阶段内置这些操作即可达到自动安装 gse agent 的目的。</p>
<h2 id="windows">Windows 系统安装</h2>
<p>待补充</p>
<h2 id="_2">导入主机到配置平台</h2>
<p>安装并成功启动后，由于配置平台尚未导入，作业平台和节点管理均无法感知到这批主机的存在，可以通过配置平台页面或者 api 方式导入到业务的空闲机资源池。</p>
<p>以 api 注册为例，用部署脚本的 <code>esb_api_test.sh</code> 做导入测试，具体参数请参考 esb api 文档。</p>
<pre class="codehilite"><code class="language-bash"># 导入 10.0.0.2 操作系统（bk_os_type为1，linux），云区域id为0（直连区域），导入方式为api导入(3)，导入的目标业务为《蓝鲸》（bk_biz_id为2）
/data/install/bin/esb_api_test.sh post /api/c/compapi/v2/cc/add_host_to_resource/ '&quot;bk_biz_id&quot;:2,&quot;host_info&quot;:{&quot;0&quot;:{&quot;bk_host_innerip&quot;:&quot;10.0.0.2&quot;,&quot;import_from&quot;:&quot;3&quot;,&quot;bk_cloud_id&quot;:0,&quot;bk_os_type&quot;:&quot;1&quot;}}'</code></pre>


<h2 id="_3">节点管理启动插件</h2>
<p>导入配置平台成功后，节点管理的周期任务会自动同步主机列表（每 10 分钟）。确认在节点管理的页面能查询到新增主机的 agent 状态为绿色再进行下一步操作。</p>
<ul>
<li>如果需要接入蓝鲸监控，采集主机性能数据，请选择更新 <code>basereport</code> 插件</li>
<li>如果需要接入蓝鲸监控，采集主机的进程端口数据，请选择更新 <code>processbeat</code> 插件</li>
</ul><h1 id="proxy">手动安装 proxy</h1>
<ul>
<li>此文档实现方案有别于节点管理 - 手动安装 agent 方案</li>
<li>提供网络环境复杂、需要了解安装逻辑的用户使用</li>
</ul>
<h2 id="_1">安装流程</h2>
<h3 id="1">1. 安装前准备</h3>
<p><strong>确认接入点配置、访问策略</strong> &gt; <strong>创建云区域</strong> &gt; <strong>导入主机至 cmdb</strong> &gt; <strong>启用 proxy</strong></p>
<h3 id="2-proxy">2. 安装 proxy 简要流程</h3>
<p><strong>同步 proxy 安装包</strong> &gt; <strong>更改配置</strong> &gt; <strong>启动 proxy</strong> &gt; <strong>配置 pagent 安装环境</strong> &gt; <strong>测试验证</strong></p>
<h2 id="_2">安装前准备</h2>
<ol>
<li>确认接入点配置、访问策略<ul>
<li>接入点请在节点管理页面配置: http://paas.bktencent.com/o/bk_nodeman/#/global-config/gse-config</li>
<li>访问策略参考: https://bk.tencent.com/docs/document/5.1/21/686</li>
</ul>
</li>
<li>创建云区域<ul>
<li>云区域请在节点管理页面创建：http://paas.bktencent.com/o/bk_nodeman/#/cloud-manager</li>
</ul>
</li>
<li>导入主机至 cmdb<ul>
<li>限制 1：由于 cmdb 限制，不能直接通过 web 页面的方式导入非直连区域的机器</li>
<li>限制 2：目前版本不能导入手动安装的 proxy 至 节点管理</li>
<li>导入方案：从节点管理中使用安装 proxy，导入 cmdb 后终止任务的方式达到导入的效果</li>
<li>不导入的影响：无法安装 pagent、管理插件</li>
</ul>
</li>
<li>获取对应的业务 ID、云区域 ID</li>
<li>启用 proxy <ul>
<li>可参考 https://bk.tencent.com/docs/document/6.0/127/7917</li>
</ul>
</li>
</ol>
<h2 id="_3">安装</h2>
<ol>
<li>准备主机<ul>
<li>云区域对外通信的代理节点。在非直连的云区域，需要安装 proxy 让蓝鲸可以连接到这个区域下的主机进行管控。为了负载均衡和容灾的考虑，您可以在一个云区域中安装多个 proxy</li>
<li>proxy 仅可安装在 liunx 操作系统下</li>
<li>此处准备了一台 centos7.6 机器</li>
</ul>
</li>
<li>同步 proxy 安装包<ul>
<li>登陆节点管理后台
    <code>bash
    source /data/install/utils.fc
    ssh $BK_NODEMAN_IP
    获取： /data/bkce/public/bknodeman/download/gse_proxy-linux-x86_64.tgz</code></li>
<li>上传 gse_proxy-linux-x86_64.tgz 至 proxy 机器 /tmp 目录</li>
</ul>
</li>
<li>停止原有 proxy/agent 进程（如未在此机器上安装过 proxy/agent ，则可跳过此步骤）<ul>
<li>停止原有 proxy/agent 进程
    <code>bash
    # 曾安装 proxy 
    /usr/local/gse/proxy/bin/gsectl stop
    # 曾安装 agent
    /usr/local/gse/agent/bin/gsectl stop</code></li>
<li>停止采集器插件进程
    <code>bash
    cd /usr/local/gse/plugins/bin
    # 停止该机器上的采集器插件进程
    ls * | grep -v '.sh' | xargs -n 1 -I {} ./stop.sh {}
    # 
    ls * | grep -v '.sh' | xargs -n 1 -I {} pidof {} | xargs kill -9</code></li>
<li>移除安装目录
    <code>bash
    rm -rf /usr/local/gse</code></li>
</ul>
</li>
<li>解压安装包
    <code>bash
    mkdir -p /usr/local/gse
    tar xf gse_proxy-linux-x86_64.tgz -C /usr/local/gse</code></li>
<li>获取配置文件<ul>
<li>默认 gse_proxy-linux-x86_64.tgz 中是不包含任何配置文件。通过节点管理安装时，配置文件是通过节点管理接口生成（http://节点管理后台/get_gse_config）</li>
<li>此次安装将从中控机上 nodeman 后台模块中获取 proxy 配置
    <code>bash
    cd /data/src/bknodeman/nodeman/apps/backend/agent/templates
    ls proxy*conf | xargs tar czf proxy_conf.tgz</code></li>
</ul>
</li>
<li>
<p>更改配置文件</p>
<ul>
<li>上传 proxy_conf.tgz 至 proxy 机器</li>
<li>解压，重命名配置文件
    <code>bash
    tar xf proxy_conf.tgz /proxy/etc/
    rename 'proxy#etc#' '' /usr/local/gse/proxy/etc/*.conf
    mv proxy.conf agent.conf</code></li>
<li>
<p>修改配置
    将配置中占位符变量（占位有：__、@@）替换为对应的值
    ```bash
    # 路径
    GSE_AGENT_HOME=/usr/local/gse    # gse proxy/agent 安装路径，默认即可
    # ip
    PROXY_LAN_IP=10.0.0.1            # proxy 机器的内网 ip，即可以与 pagent 通讯的 ip
    PROXY_IP0=                       # proxy 机器的内网 ip，即可以与 pagent 通讯的 ip
    PROXY_IP1=                       # 替换为对应第二台 proxy 机器的外网 ip，如果只有单台 proxy ，请把相关行配置删除
    PROXY_WAN_IP=                    # proxy 机器的外网 ip，即可以与 gse server 通讯的 ip
    GSE_WAN_IP0=                     # gse 外网IP，即可以与 proxy 通讯的 ip
    GSE_WAN_IP1=                     # 第二台 gse 外网IP（可选），如果只有单台 gse ，请把相关行配置删除
    EXTERNAL_IP=$PROXY_LAN_IP        # 标识 IP，替换为对应 proxy 机器的内网 ip
    # id                          <br />
    BIZ_ID=                          # 业务 ID，替换为“安装前准备”中获取的业务 ID
    CLOUD_ID=                        # 云区域 ID，替换为“安装前准备”中获取的云区域 ID
    # port
    gse_task 端口                    # 默认版本为企业版端口，社区版请改为对应端口
    gse_btsvr 端口                   # 默认版本为企业版端口，社区版请改为对应端口</p>
<p><code>- 配置修改后，请确认配置内容符合 json 语法</code>bash
cat xxx.conf | jq
<code>5. 同步 gsecmdline</code>bash
    cp -fp /usr/local/gse/plugins/bin/gsecmdline /bin/
    chmod 775 /bin/gsecmdline
    <code>6. 启动 proxy 进程，启动后可简单测试执行命令、文件分发是否正常
    - 启动</code>bash
cd /usr/local/gse/proxy/bin &amp;&amp; ./gsectl start
<code>- 确认进程已启动：gse_agent、gse_transit、gse_btsvr
    - 启动异常排查：
1. 日志：/var/log/gse
2. 进程是否启动
3. 端口是否监听
4. 网络策略是否正常
7. 利用作业平台 - 全业务分发 agent 安装包、安装工具、辅助工具（windows）
    - proxy 中将缓存一份 agent 安装包、辅助工具（windows），实际安装时 pagent 将通过 proxy 上的代理服务从 节点管理后台获取对应的安装包、辅助工具（windows）
    - 文件来源
1. 蓝鲸 bknodeman 机器
2. 文件列表(默认路径:/data/bkce/public/bknodeman/download/，请按实际更改)</code>bash
    /data/bkce/public/bknodeman/download/gse_client-windows-x86.tgz
    /data/bkce/public/bknodeman/download/gse_client-windows-x86_64.tgz
    /data/bkce/public/bknodeman/download/gse_client-linux-x86.tgz
    /data/bkce/public/bknodeman/download/gse_client-linux-x86_64.tgz
    /data/bkce/public/bknodeman/download/py36.tgz
    /data/bkce/public/bknodeman/download/nginx-portable.tgz
    /data/bkce/public/bknodeman/download/curl-ca-bundle.crt
    /data/bkce/public/bknodeman/download/curl.exe
    /data/bkce/public/bknodeman/download/libcurl-x64.dll
    /data/bkce/public/bknodeman/download/7z.dll
    /data/bkce/public/bknodeman/download/7z.exe
    /data/bkce/public/bknodeman/download/handle.exe
    /data/bkce/public/bknodeman/download/unixdate.exe
    /data/bkce/public/bknodeman/download/tcping.exe
    <code>- 传输目标
1. proxy 机器的 /data/bkce/public/bknodeman/download/ 目录
8. 配置 pagent 安装环境、proxy 上启动正向代理服务
    - pagent 安装时将通过 proxy 的代理通道下载相关安装包</code>bash
    # 此处逻辑不作赘述，直接复用节点管理脚本
    # proxy 上执行
    /opt/nginx-portable/nginx-portable stop || :;
    rm -rf /opt/nginx-portable/;
    rm -rf /opt/py36/;
    tar xvf /data/bkce/public/bknodeman/download/py36.tgz -C /opt;
    tar xvf /data/bkce/public/bknodeman/download/nginx-portable.tgz -C /opt;
    user=nobody
    group=nobody
    #create group if not exists
    egrep "^$group" /etc/group &gt;&amp; /dev/null
    if [ $? -ne 0 ]; then
groupadd $group
    fi</p>
</li>
</ul>
<h1 id="create-user-if-not-exists">create user if not exists</h1>
<p>egrep "^$user" /etc/passwd &gt;&amp; /dev/null
if [ $? -ne 0 ]; then
    useradd -g $group $user
fi
echo -e "
events {
    worker_connections  65535;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    server {
        listen 17980;
        server_name localhost;
        root /data/bkce/public/bknodeman/download;</p>
<pre class="codehilite"><code>    location / {
        index index.html;
    }
    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }
}
server {
    listen 17981;
    server_name localhost;
    resolver `echo $(awk 'BEGIN{ORS=&quot; &quot;} $1==&quot;nameserver&quot; {print $2}' /etc/resolv.conf)`;
    proxy_connect;
    proxy_connect_allow 443 563;
    location / {
        proxy_pass http://\$http_host\$request_uri;
    }
}</code></pre>


<p>}" &gt; 
/opt/nginx-portable/nginx-portable start
sleep 5
is_port_listen_by_pid () {
    local pid regex ret
    pid=$1
    shift 1
    ret=0</p>
<pre class="codehilite"><code>for i in {0..10}; do
    sleep 1
    for port in &quot;$@&quot;; do
        stat -L -c %i /proc/&quot;$pid&quot;/fd/* 2&gt;/dev/null \
        | grep -qwFf - &lt;( awk -v p=&quot;$port&quot; 'BEGIN{ check=sprintf(&quot;:%04X0A$&quot;, p)} $2$4 ~ check {print $10}' /proc/net/tcp) \
        || ((ret+=1))
    done
done
return &quot;$ret&quot;</code></pre>


<p>}
pid=$(cat /opt/nginx-portable/logs/nginx.pid)
is_port_listen_by_pid "$pid" 17980 17981
exit $?
```
9. 启用插件
- 通过节点管理 - 插件管理 - 托管</p>
</li>
</ol><h1 id="_1">作业平台</h1>
<p>本文描述作业平台在日常运维中遇到的问题，排查思路和解决方案。</p>
<h2 id="_2">常见问题</h2>
<h3 id="can-not-find-agent-by-src-ip-xxxx">本地文件上传提示"can not find agent by src ip x.x.x.x"</h3>
<p>问题原因：</p>
<p>作业平台调用管控平台接口时，传递自身的内网 ip 地址有误。</p>
<blockquote>
<p>本地文件上传的原理是，前端将文件传给作业平台后台，作业平台落地到本机的磁盘目录，然后调用管控平台的文件分发接口分发。 调用文件分发接口时需要传递本机 IP 地址，该 IP 地址需要是正常安装了 gse_agent 且状态正常。 作业平台的 <code>job-execute</code> 模块在启动时，经过一系列的逻辑，会尽可能自动获取到正确的内网 IP 地址。但是如果用户部署 <code>job_execute</code> 的主机存在多个内网 ip 地址，且尚未安装 agent 的时，<code>job_execute</code> 可能随机获取到一个不正确的内网 IP 地址。</p>
</blockquote>
<p>解决方案：</p>
<ul>
<li>安装《蓝鲸》业务下服务器的 agent 后，重启下 job 服务器的 <code>bk-job-execute</code>服务：<code>systemctl restart bk-job-execute</code>，触发它启动阶段自动获取正确内网 IP 地址的逻辑。</li>
</ul><h1 id="nginx">Nginx</h1>
<p>蓝鲸平台的 Web 接入层统一使用 <a href="https://openresty.org/cn/">OpenResty</a> ，因为部分模块依赖 lua 模块。在模块分布配置文件 install.config 中，为了兼容以前的配置，以 nginx 代替。</p>
<h2 id="_1">安装部署</h2>
<p>蓝鲸使用 OpenResty 1.15.8.3 版本，通过官方的 rpm 包安装。安装路径为默认的 <code>/usr/local/openresty/</code></p>
<p>安装后，默认的配置文件不符合蓝鲸的需求，通过部署脚本包的配置模板文件（$CTRL_DIR/support-files/templates/nginx/nginx.conf) 渲染生成 Nginx 的主配置文件 <code>/usr/local/openresty/nginx/conf/nginx.conf</code>，并新建子配置目录 <code>/usr/local/openresty/nginx/conf/conf.d/</code>。以上安装逻辑，统一由 <code>$CTRL_DIR/bin/install_openresty.sh</code> 脚本封装。</p>
<p>在安装了 OpenResty 服务的机器上，还会配套安装 <code>consul-template</code> 服务，用来动态渲染 nginx 的子配置。通过 <code>$CTRL_DIR/bin/install_consul_template.sh</code> 脚本封装：</p>
<ol>
<li>安装 consul-template rpm 包</li>
<li>读取和 nginx 相关的环境变量，并初始化 consul kv 节点信息，位于 consul kv 的 bkcfg/ 节点下。</li>
<li>将 <code>$CTRL_DIR/support-files/templates/nginx/*</code> 的配置模板拷贝到 <code>/etc/consul-template/templates/</code> 目录下。</li>
<li>生成 <code>paas</code>、<code>cmdb</code>、<code>job</code>、<code>nodeman</code>等模块的 consul-template 配置描述文件到 <code>/etc/consul-template/conf.d/</code> 目录下。</li>
<li>启动 consul-template，并设置开机启动</li>
</ol>
<h2 id="nginx_1">Nginx 子配置管理</h2>
<p>Nginx 的子配置，通过 <code>consul-template</code> 服务和 consul 服务以及 kv 存储配置来动态渲染。
以 <code>paas</code> 项目的配置为例，先查看 <code>/etc/consul-template/conf.d/paas.conf</code> 配置：</p>
<pre class="codehilite"><code class="language-bash">template {
  source = &quot;/etc/consul-template/templates/paas.conf&quot;
  destination = &quot;/usr/local/openresty/nginx/conf/conf.d/paas.conf&quot;
  command = &quot;/bin/sh -c '/usr/local/openresty/nginx/sbin/nginx -t &amp;&amp; echo reload openresty &amp;&amp; systemctl reload openresty'&quot;
  command_timeout = &quot;10s&quot;
}</code></pre>


<p>该配置表明：源配置模板位于 <code>/etc/consul-template/templates/paas.conf</code> ，生成的目标文件位于 <code>/usr/local/openresty/nginx/conf/conf.d/paas.conf</code>，生成后，执行重载 openresty 的命令</p>
<p>consul-template 的模板使用 golang 的 模板语言，具体可参考官方文档：https://github.com/hashicorp/consul-template/blob/master/docs/templating-language.md </p>
<h2 id="nginx_2">蓝鲸 Nginx 转发规则简介</h2>
<h3 id="nginx_3">最外接入层 Nginx</h3>
<p>在模块分布配置 install.config 中配置的 nginx 服务器上运行的 openresty 服务是对应蓝鲸 web 最外层接入层模块。用户在浏览器中输入蓝鲸平台域名，经由 DNS 解析或者 /etc/hosts 配置，访问该 Nginx。根据访问的域名不同，请求根据配置转发到不同后端。由以下四个配置组成：</p>
<ul>
<li>paas.conf, app_upstream.conf (PaaS 平台接入层配置)</li>
<li>cmdb.conf (配置平台 Web 接入层配置)</li>
<li>job.conf （作业平台 Web 和 api 接入层）</li>
<li>nodeman.conf (节点管理 api 接入层和静态资源上传下载服务)</li>
</ul>
<h4 id="paas">PaaS 平台</h4>
<p>PaaS 平台包含五个后端服务，分别通过五个 consul service 来动态渲染。括号内是哪些 url 开头的规则会转发给这些服务：</p>
<ul>
<li>paas-appengine (/v1)</li>
<li>paas-esb (/api/)</li>
<li>paas-login (/login/)</li>
<li>paas-apigw (/api/apigw/、/apigw/)</li>
<li>paas-paas (/console/、/)</li>
<li>web-console (/o/bk_bcs_app/web_console/) (可选，安装 BCS 后才有用) </li>
</ul>
<p>这些 consul service 是在 安装 PaaS 模块的时候，通过 consul 接口注册服务地址和服务端口的。</p>
<p>另外值得单独提出的是，访问 <code>/o/</code> 和 <code>/t/</code> 开头的 url 的时候，会将请求转发到 <code>app_upstream.conf</code> 文件中定义的 appo 和 appt 所在服务器的 Nginx 端口。
<code>app_upstream.conf</code> 文件的动态渲染也是经由 <code>consul-template</code> 服务读取 consul kv 中以 <code>bkapps/</code> 开头的键值对来完成的。</p>
<p>bkapps/ 开头的 kv 数据，是通过 paas-appengine 模块在 SaaS 部署的时候，选择的部署服务器 IP：PORT 后，将 app_code 和 部署服务器信息关联，区分部署环境后，写入到 bkapps/下。可以通过命令 <code>consul kv get -recurse bkapps/</code> 来查看相关数据结构，结合 <code>/etc/consul-template/templates/app_upstream.conf.tpl</code> 文件来理解。</p>
<h4 id="_2">配置平台</h4>
<p>配置平台仅通过 nginx 暴露 cmdb-web 的服务端口。cmdb-api 的服务，由 esb 模块，直接通过配置文件配置 <code>cmdb-web.service.consul</code> 的内部域名来访问，不经过 nginx 代理。</p>
<h4 id="_3">作业平台</h4>
<p>新版作业平台的架构，前后端代码分离。前端静态资源由一个域名提供访问（$BK_JOB_PUBLIC_URL）。前端静态资源需要配置一个后端 jobapi 的访问地址来调用后端 api 服务（$BK_JOB_API_PUBLIC_ADDR），所以 作业平台的 nginx 分为两个 server block，分别是：</p>
<ul>
<li>静态资源配置</li>
<li>job-gateway 后端 api 访问配置</li>
</ul>
<h4 id="_4">节点管理</h4>
<p>节点管理对于 Nginx 的需求可以分为四个方面：</p>
<ol>
<li>提供静态资源下载能力，安装 gse_agent 和监控插件需要通过 http 协议下载包</li>
<li>提供静态资源上传能力，供蓝鲸其他平台调用，供用户上传文件存储（nginx+upload 模块）</li>
<li>提供内部网络 api 接口，供 esb 调用</li>
<li>（可选）提供外网 api 接口，在跨云安装 Proxy/agent 时，提供 API 访问。</li>
</ol>
<p>所以 节点管理的 nginx 配置是最为复杂的一个。</p>
<h2 id="_5">常见问题</h2>
<h3 id="consul-kv-nginx">修改了 consul kv 配置，但是 nginx 子配置没生效</h3>
<ol>
<li>
<p>确认该 nginx 机器上的 openresty 处于运行状态：</p>
<p><code>bash
systemctl status consul-template</code></p>
</li>
<li>
<p>确认 consul-template 的日志是否包含错误</p>
<p><code>bash
journalctl -u consul-template</code></p>
</li>
<li>
<p>手动一次性运行，并开启 debug 输出。以 paas.conf 为例</p>
<p><code>bash
consul-template \
-once -log-level debug -dry \
-template '/etc/consul-template/templates/paas.conf:/tmp/paas.conf'</code></p>
</li>
</ol><h1 id="consul">Consul</h1>
<p><a href="https://www.consul.io/">Consul</a> 作为蓝鲸组件的基础组件，提供了以下功能：服务发现，域名注册，动态配置渲染等功能。</p>
<ol>
<li>服务发现（通过 dns 和 http 接口）</li>
<li>服务健康检查（通过外部脚本和 TCP 探测端口方式）</li>
<li>KV 存储<ul>
<li>蓝鲸监控后台利用 consul 来缓存元数据信息</li>
<li>SaaS 部署利用 consul 来存储部署服务器信息</li>
<li>consul-template 利用 consul 的服务配置来动态生成 nginx 配置文件</li>
</ul>
</li>
</ol>
<p>运维蓝鲸需要对 Consul 基础有一定了解。</p>
<p>本文从最初的安装部署到日常问题处理，描述 Consul 运维相关的内容。</p>
<p>关于 Consul 的基本概念和知识，建议阅读 Consul 官方的快速入门教程：<a href="https://learn.hashicorp.com/consul">https://learn.hashicorp.com/consul</a></p>
<h2 id="_1">安装部署</h2>
<p>蓝鲸采用 rpm 包来安装 consul，安装后的文件列表如下：</p>
<pre class="codehilite"><code class="language-bash">$ rpm -ql consul
/etc/consul.d/consul.json-dist
/etc/consul.d/service
/etc/logrotate.d/consul
/etc/sysconfig/consul
/usr/bin/consul
/usr/lib/systemd/system/consul.service
/usr/share/consul
/var/lib/consul</code></pre>


<p>根据用户环境传入的参数，自动配置并在 <code>/etc/consul.d/</code> 目录下生成 <code>consul.json</code>、<code>server.json</code>、<code>auto_join.json</code>、<code>recursor.json</code>、<code>telemetry.json</code>配置文件。</p>
<p>这些操作，封装为 <code>./bin/install_consul.sh</code> 脚本。该脚本无参数运行时，会输出帮助文档如下：</p>
<pre class="codehilite"><code class="language-bash">$ ./bin/install_consul.sh 
用法: 
    install_consul.sh [ -h --help -?  查看帮助 ]
            [ -j, --join            [必填] &quot;集群auto join的服务器列表，逗号分隔&quot; ]
            [ -e, --encrypt-key     [必填] &quot;集群通信的key，用consul keygen生成，集群内必须一致&quot; ]
            [ -d, --data-center     [选填] &quot;datacenter名字，默认为dc&quot; ]
            [ -r, --role            [可选] &quot;部署的consul角色，取值server或client，默认为client&quot; ]
            [ --dns-port            [可选] &quot;部署的consul dns 端口号，默认为8600&quot; ]
            [ --http-port           [可选] &quot;部署的consul http 端口号，默认为8500&quot; ]
            [ -b, --bind            [可选] &quot;监听的网卡地址,默认为127.0.0.1&quot; ]
            [ -n, --server-number   [可选] &quot;如果是server模式，配置集群中的server数量&quot; ]
            [ --node                [可选] &quot;node_name，配置consul节点名，默认为hostname&quot; ]
            [ -v, --version         [可选] &quot;查看脚本版本号&quot; ]</code></pre>


<p>比较重要的参数有：</p>
<ul>
<li><code>-e, --encrypt-key</code>: 它是蓝鲸部署准备阶段 <code>./bkcli install bkenv</code> 的时候，自动通过 <code>consul keygen</code>生成，并保存到 <code>./bin/01-generate/dbadmin.env</code> 中的 <code>BK_CONSUL_KEYSTR_32BYTES</code></li>
<li><code>-r, --role</code>: 决定安装的是 consul server 还是 consul client。 consul server 是 <code>install.config</code> 中配置了 <code>consul</code> 模块的机器（$BK_CONSUL_IP[@]}）。其余的机器为 consul client</li>
<li><code>-j, --join</code>: consul 启动的时候，自动加入的集群 ip 列表。</li>
<li><code>-b, --bind</code>: consul 的 dns 和 http 协议端口监听的网卡地址，默认是 127.0.0.1。</li>
</ul>
<p>安装并启动成功后，脚本会修改 <code>/etc/resolv.conf</code></p>
<ol>
<li>添加 <code>nameserver 127.0.0.1</code> 配置项，并保证它位于第一行</li>
<li>如果存在 option 的配置，且包含了 <code>rotate</code>，则删除该选项，防止轮询。因为蓝鲸依赖 consul 监听的 127.0.0.1:53 做解析。</li>
<li>添加 <code>search node.consul</code>，因为 consul 默认会注册本机的 <code>&lt;node_name&gt;.node.consul</code> 这样长主机名，一些 java 应用读取本机的$HOSTNAME 后反向解析 ip 的时候，会用到。</li>
</ol>
<p>然后停掉 <code>nscd</code> 的缓存服务。</p>
<p>最后通过判断 <code>consul.service.consul</code> 是否可以解析来判断本机的 consul 安装成功与否。</p>
<h2 id="consul_1">Consul 配置项说明</h2>
<p>consul 的配置读取优先级从高到低依次为：</p>
<ol>
<li>命令行参数</li>
<li>环境变量</li>
<li>配置文件</li>
</ol>
<p>consul 可以不需要使用任何命令行开关和配置，都有默认值，请参考官方文档的配置项的默认值说明。见：https://www.consul.io/docs/agent/options</p>
<p>蓝鲸部署 consul 主要采用了命令行参数+配置文件的方式。命令行参数在下一节启停中会提到，写在 <code>/etc/sysconfig/consul</code> 中，配置文件按功能，拆分为以下几个子配置：</p>
<ol>
<li>
<p>consul.json</p>
<p><code>json
{
    "bind_addr": "10.0.0.1",
    "log_level": "info",
    "log_file": "/var/log/consul/consul.log",
    "datacenter": "dc",
    "data_dir": "/var/lib/consul",
    "node_name": "bk-1",
    "disable_update_check": true,
    "enable_local_script_checks": true,
    "encrypt": "PQ97sDNs79DS6xnCmo7yAWCkBaYGqFemmo71wDkgtwU=",
    "ports": {
        "dns": 53,
        "http": 8500
    }
}</code></p>
<p>主配置中大部分参数都和命令行指定的参数一致，不再赘述。值得一提的是：</p>
<ul>
<li>datacenter：指定的数据中心，对于跨数据中心部署有意义。</li>
<li>enable_local_script_checks: 该功能开关，允许 consul 运行本地脚本来进行健康探测。</li>
</ul>
</li>
<li>
<p>server.json: 该配置只有安装时角色为 <code>server</code> 的主机上才存在。</p>
<p><code>json
{
    "server": true,
    "bootstrap_expect": 3
}</code></p>
<ul>
<li><code>bootstrap_expect</code>: 表示集群初次选举 leader 时最少应该有多少个节点。</li>
</ul>
</li>
<li>
<p>auto_join.json: 配置 consul 启动后自动加入的集群的 ip 列表</p>
</li>
<li>recursors.json: 从 <code>/etc/resolv.conf</code> 中读取已有的 nameserver ip，并写入到该配置。如果原本没有配置 nameserver，则不存在该配置文件。</li>
<li>telemetry.json: 配置监控 metrics 接口相关的参数。详见：<a href="https://www.consul.io/docs/agent/telemetry">https://www.consul.io/docs/agent/telemetry</a></li>
</ol>
<p>配置文件全部准备妥当后，可以通过命令 <code>consul validate /etc/consul.d</code> 来校验所有的 <code>*.json</code> 合并后的语法/语义是否符合 <code>consul agent</code> 启动所需。注意该命令需要接受完整的配置定义，而不能只传递部分配置，譬如 <code>consul validate /etc/consul.d/server.json</code> 会报错。</p>
<h2 id="consul_2">Consul 启停</h2>
<p>consul 通过 rpm 安装的 <code>/usr/lib/systemd/system/consul.service</code> 注册了 consul.service 的服务。并在 <code>./bin/install_consul.sh</code> 脚本中，设置了开机启动。</p>
<p>启动用户是 rpm 安装时，自动创建的 <code>consul</code> 用户。启动命令是 <code>/usr/bin/consul $CMD_OPTS</code>。<code>$CMD_OPTS</code>是从 <code>/etc/sysconfig/consul</code> 中定义的。
如果想自定义启动参数，比如添加 <code>-ui</code> 参数打开 consul 的 web 管理端界面，需要修改 <code>/etc/sysconfig/consul</code> 文件，然后通过 <code>systemctl restart consul</code> 来生效。</p>
<p>默认的参数是：<code>agent -config-dir=/etc/consul.d -config-dir=/etc/consul.d/service -data-dir=/var/lib/consul</code>，这里指定了两个 <code>-config-dir</code>，因为 consul 不支持递归找目录下的所有配置。
只扫描第一层目录的 <code>*.json</code> 和 <code>*.hcl</code> 后缀的配置文件。<code>/etc/consul.d/*.json</code> 存放 consul 本身启动需要的配置。 <code>/etc/consul.d/service/*.json</code> 存放服务定义的配置文件。</p>
<p>极少的情况下，需要停止 <code>consul</code> 服务，停止 consul 服务使用 <code>systemctl stop consul</code> 命令。但往往需要的是屏蔽某个域名服务解析到本机，特别是滚动更新一个后台模块的时候。
这种情况，请使用：<code>consul maint -enable</code> 将本机设置为维护模式。这样该节点的所有服务，都不会通过 consul 的 dns 或者 http 接口返回。更新完毕后，使用<code>consul maint -disable</code>解除维护模式。</p>
<p>还有一种情况，是需要下架该机器，回收机器。这时应该使用 <code>consul leave</code> 来优雅退出，再通过 <code>systemctl disable consul</code> 去掉开机启动。</p>
<h2 id="_2">服务发现</h2>
<p>consul 的服务发现功能，从三个方面来介绍：</p>
<ul>
<li>注册服务</li>
<li>查询服务</li>
<li>更新服务</li>
</ul>
<h3 id="_3">注册服务</h3>
<p>consul 支持两种形式来注册服务：</p>
<ul>
<li>服务定义文件(位于/etc/consul.d/service/*.json)</li>
<li>HTTP API</li>
</ul>
<p>蓝鲸目前两种方式均有采用。除了 <code>rabbitmq</code> 和 <code>bkmonitorv3</code>相关模块是后台启动后调用 HTTP API 自动注册服务外，其余均是通过自动生成<code>/etc/consul.d/service/*.json</code>的服务定义文件，在 consul 启动时自动加载注册。</p>
<p>本节介绍通过第一种方式注册服务的细节。</p>
<p>假设我们为蓝鲸的 MySQL 服务定义一个名为 mysql-default 的服务，它指定：</p>
<ol>
<li>服务名称为 <code>mysql-default</code></li>
<li>服务端口为 3306</li>
<li>健康探测为: 通过 TCP 协议检测 <code>本机内网IP:3306</code> 端口</li>
</ol>
<pre class="codehilite"><code class="language-bash">cat &lt;&lt;EOF &gt; /etc/consul.d/service/mysql-default.json
{
  &quot;service&quot;: {
    &quot;id&quot;: &quot;mysql-default-45e3b960-45df-11eb-b0bd-5254006f5633&quot;,
    &quot;name&quot;: &quot;mysql-default&quot;,
    &quot;address&quot;: &quot;10.0.0.1&quot;,
    &quot;port&quot;: 3306,
    &quot;check&quot;: {
      &quot;tcp&quot;: &quot;10.0.0.1:3306&quot;,
      &quot;interval&quot;: &quot;10s&quot;,
      &quot;timeout&quot;: &quot;3s&quot;
    }
  }
}
EOF</code></pre>


<p>配置项说明如下：</p>
<ul>
<li>name: 对应服务名称</li>
<li>id: 为了避免同名冲突，根据 uuid 生成一个随机串</li>
<li>address: 该服务对外暴露的访问 ip 地址</li>
<li>port: 该服务对外暴露的访问端口</li>
<li>check: 定义健康检查机制</li>
<li>tcp: 通过 tcp 进行探测，参数为探测的 ip 和端口</li>
<li>interval: 检查间隔时间，蓝鲸统一设定为 10s</li>
<li>timeout: tcp 探测的超时时间为 3s</li>
</ul>
<p>运行 <code>consul reload</code> 加载配置，让上述配置生效。</p>
<h3 id="_4">查询服务</h3>
<p>consul agent 启动，且成功注册服务后，可以通过两种方式来查询服务。</p>
<ol>
<li>DNS</li>
<li>HTTP API</li>
</ol>
<p>对于第一种 DNS 方式，服务的 DNS 域名是 <strong><code>NAME</code>.service.consul</strong>。</p>
<p>默认情况下，所有的 DNS 域名都是以<code>.consul</code>结尾的，虽然这也是可以配置的（-domain 命令行开关，或者 domain 配置选项指定）。service 这个子域名，告诉 consul，我们需要查询的是服务，最后 NAME 对应这个服务的名字。</p>
<p>对于刚才定义的 <code>mysql-default</code> 服务，组合起来的域名为：mysql-default.service.consul</p>
<p>使用 dig 命令查询：</p>
<pre class="codehilite"><code class="language-bash">$ dig mysql-default.service.consul

...
;; QUESTION SECTION:
;mysql-default.service.consul.      IN  A

;; ANSWER SECTION:
mysql-default.service.consul.   0   IN  A   10.0.0.1
...</code></pre>


<p>可以看到，consul 返回了一个 A 记录，A 记录包含一个 IP 地址，而这个 IP 地址是对应的 mysql-default 服务所在节点的 IP 地址。</p>
<p>该节点返回的 IP 地址为什么恰好是 10.0.0.1，而不是 127.0.0.1，或者那台主机上其他网卡的地址（如果存在多网卡私有 IP）呢？</p>
<p>这是由 consul 启动时的 <code>-advertise</code> 参数，或者配置文件的 <code>address</code> 参数指定的。consul 启动时，可以通过观察标准输出的 "Cluster Addr: " 来确定这个信息。</p>
<p>通过 dns 接口，除了 A 记录，还可以查询 <code>SRV</code> 记录来获取这个服务的地址/端口对：</p>
<pre class="codehilite"><code class="language-bash">$ dig mysql-default.service.consul SRV

...
;; QUESTION SECTION:
;mysql-default.service.consul.  IN  SRV

;; ANSWER SECTION:
mysql-default.service.consul. 0 IN  SRV 1 1 3306 0a00057f.addr.dc.consul.

;; ADDITIONAL SECTION:
0a00057f.addr.dc.consul. 0  IN  A   10.0.0.1
bk-1.node.dc.consul.    0 IN    TXT &quot;consul-network-segment=&quot;
...</code></pre>


<p>SRV 记录的 ANSWER SECTION 字段含义从左到右依次为：</p>
<ul>
<li>域名</li>
<li>TTL</li>
<li>Class(IN)</li>
<li>Record Type(SRV)</li>
<li>Priority(优先级)</li>
<li>权重(weight)</li>
<li>服务端口</li>
<li>服务主机名</li>
</ul>
<p>注意 SRV 记录还返回额外信息，也就是主机名的 A 记录，包含对应的 IP 地址。</p>
<p>除了 DNS API，也可以使用 HTTP API 来查询服务：</p>
<pre class="codehilite"><code class="language-bash">curl -s http://127.0.0.1:8500/v1/catalog/service/mysql-default | jq </code></pre>


<p>8500 端口是 consul 监听的 http-port，处于安全考虑，默认只监听本机的回环地址（127.0.0.1）。</p>
<p>catalog API 是列出所有提供该服务名称的的节点。</p>
<p>后面我们提到健康检查时，会用到只查询当前能提供服务的健康节点的 API。</p>
<p>对于 DNS API 来说，查询健康的节点是默认的行为。而 HTTP 则需要加上参数：</p>
<pre class="codehilite"><code class="language-bash">curl -s http://127.0.0.1:8500/v1/health/service/mysql-default?passing | jq</code></pre>


<h3 id="_5">更新服务</h3>
<p>通过修改服务定义文件，然后发送 SIGHUP 信号给 consul，来达到更新服务定义的目的。</p>
<p>运行 <code>consul reload</code> 相当于发送 <code>SIGHUP</code> 信号。</p>
<h3 id="_6">脚本封装</h3>
<p>部署脚本目录下因为注册 consul 服务是一个很常见的操作，封装了一个原子脚本 <code>./bin/reg_consul_svc</code> 来协助生成 consul 服务定义文件到标准输出。安装部署脚本再根据一定的规则，生成落地文件到 <code>/etc/consul.d/service/NAME.json</code> 中。</p>
<p>该脚本的用法：</p>
<pre class="codehilite"><code class="language-bash">$ ./bin/reg_consul_svc 
用法: 
    reg_consul_svc [ -h --help -?  查看帮助 ]
            [ -n, --name        [必选] &quot;注册到consul的服务名(service name)&quot; ]
            [ -p, --port        [必选] &quot;注册到consul的服务端口&quot; ]
            [ -a, --address     [必选] &quot;注册到consul的服务地址，一般与服务的bindip一致&quot; ]
            [ -t, --tag         [可选] &quot;注册到consul的服务的tag&quot; ]
            [ -i, --url         [可选] &quot;consul的api地址，默认为：http://127.0.0.1:8500&quot; ]
            [ -D, --dry-run     [可选] &quot;打印出生成的consul服务定义文件到标准输出&quot; ]
            [ -v, --version     [可选] 查看脚本版本号 ]</code></pre>


<p>可以根据上文注册服务中生成的 json 文件来对应下参数和实际配置的关系。
需要提到的是：</p>
<ul>
<li><code>-t, --tag</code>: 服务 tag 可以管理同一类服务的不同具体用途。</li>
<li><code>-D, --dry-run</code>: 默认不加该参数，则直接通过 HTTP API 注册服务，如果加了该参数，才会打印生成的 json 配置到标准输出，然后自行重定向到对应的配置文件。</li>
</ul>
<h2 id="kv">KV 操作</h2>
<ul>
<li>
<p>设定键值</p>
<p><code>bash
consul kv put bkapps/upstreams/prod/bk_sops '["10.0.0.1"]'</code></p>
</li>
<li>
<p>更新键值</p>
<p><code>bash
consul kv put bkapps/upstreams/prod/bk_sops '["10.0.0.1","10.0.0.2"]'</code></p>
</li>
<li>
<p>查询键值</p>
<p><code>bash
consul kv get bkapps/upstreams/prod/bk_sops</code></p>
</li>
<li>
<p>递归查询键值</p>
<p><code>bash
consul kv get -recurse bkapps/upstreams</code></p>
</li>
<li>
<p>删除键值</p>
<p><code>bash
consul delete bkapps/upstreams/prod/bk_sops</code></p>
</li>
<li>
<p>递归删除</p>
<p><code>bash
consul delete -recurse bkapps</code></p>
</li>
</ul>
<h2 id="_7">备份</h2>
<p>consul 提供 snapshot 命令，可以通过 cli 或者 http api 来调用。snapshot 命令，会将以下 consul server 的状态数据进行备份，包括但不限于：</p>
<ol>
<li>KV 数据</li>
<li>服务目录（service catalog）</li>
<li>会话</li>
<li>ACLs</li>
</ol>
<p>在任一 consul server 节点运行：</p>
<pre class="codehilite"><code class="language-bash">consul snapshot save backup.snap</code></pre>


<p>备份后可以使用以下命令查看备份数据的元信息</p>
<pre class="codehilite"><code class="language-bash">consul snapshot inspect backup.snap</code></pre>


<p>从备份中恢复：</p>
<pre class="codehilite"><code class="language-bash">consul snapshot restore backup.snap</code></pre>


<h2 id="web">开启 Web 管理界面</h2>
<ol>
<li>选择部署 nginx 的服务器，修改 consul 的启动命令行参数 （/etc/sysconfig/consul），在 <code>CMD_OPTS</code> 中追加命令行参数 <code>-ui</code></li>
<li>重启 consul: <code>systemctl restart consul</code></li>
<li>验证是否生效：<code>curl -sL http://127.0.0.1:8500/ | grep CONSUL_VERSION</code> 如果有返回说明 webUI 正常开启</li>
<li>
<p>配置 nginx 将请求代理转发给本机 127.0.0.1:8500，这样能方便通过浏览器访问，假设我们使用 <code>consul.bktencent.com</code> 这个域名来访问。添加以下 nginx 配置，并重新加载生效。</p>
<p>```bash
source ./load_env.sh
cat &gt; /usr/local/openresty/nginx/conf/conf.d/consul.conf &lt;&lt;EOF
server {
    listen 80;
    server_name consul.bktencent.com;</p>
<pre class="codehilite"><code>access_log $BK_HOME/logs/nginx/consul_ui_access.log main;

location / {
    proxy_pass http://127.0.0.1:8500;
}</code></pre>


<p>}
EOF
systemctl reload openresty
```</p>
</li>
<li>
<p>在本机配置 hosts 文件，添加域名解析，假设 nginx 所在服务器对应的外网 ip 是 100.0.0.1</p>
<p><code>bash
100.0.0.1 consul.bktencent.com</code></p>
</li>
<li>
<p>浏览器输入 <code>http://consul.bktencent.com</code> 来访问 Consul 的 WebUI</p>
</li>
</ol>
<h2 id="_8">常用操作</h2>
<ul>
<li>查询 leader：<code>curl -s http://127.0.0.1:8500/v1/status/leader</code></li>
<li>查询集群节点：<code>consul members [-detailed]</code></li>
<li>查看当前日志：<code>consul monitor [-log-level debug]</code></li>
<li>查看当前节点运行信息：<code>consul info</code></li>
<li>查看 leader 和 follower：<code>consul operator raft list-peers</code></li>
<li>查看当前节点注册的服务：<code>curl -s http://127.0.0.1:8500/v1/agent/services</code></li>
<li>取消当前节点注册的服务：</li>
<li>1.0 以上的版本使用命令行：<code>consul services deregister &lt;my-service-id&gt;</code></li>
<li>1.0 以下的使用 httpapi：<code>curl --request PUT http://127.0.0.1:8500/v1/agent/service/deregister/&lt;my-service-id&gt;</code></li>
</ul>
<h2 id="_9">常见问题</h2>
<h3 id="consul_3">Consul 域名无法解析</h3>
<p><strong>表象</strong>：</p>
<p>在部署和使用时，如果遇到类似这样的日志信息："xx.service.consul Name or service not known" </p>
<p>意味着域名无法解析的问题。consul 域名，指的是蓝鲸集群模块之间使用 consul 模块注册的以".service.consul"结尾 的域名。它由每台机器上运行的 consul 进程监听的 53 端口提供解析服务</p>
<p><strong>思路方法</strong>：</p>
<ol>
<li>
<p>在中控机上运行命令检查所有节点的 consul 服务状态</p>
<p><code>bash
./bkcli check consul</code></p>
<ul>
<li>check_consul_process: 检查 consul 服务进程是否存活</li>
<li>check_consul_listen_udp_53： 检查 consul 服务是否监听了 udp 53</li>
<li>check_consul_listen_tcp_8500: 检查 consul 服务是否监听了 tcp 8500</li>
<li>check_consul_warning_svc: 检查 consul 服务有哪些状态为 warnning 的</li>
<li>check_consul_critical_svc: 检查 consul 服务有哪些状态为 critical 的</li>
<li>check_resolv_conf_127.0.0.1: 检查 consul 节点上/etc/resolv.conf 中 nameserver 配置不正确的</li>
</ul>
</li>
<li>
<p>一般情况下，check_consul_critical_svc 会列出故障的服务名。</p>
</li>
<li>根据服务名需要确认对应的进程是否正常启动并成功监听了指定的端口（结合本文档中，注册服务章节的知识）</li>
<li>重新启动对应服务模块的进程，等待 10s 后再次运行 <code>./bkcli check consul</code> 来判断服务是否健康</li>
<li>对于 check_resolv_conf_127.0.0.1 失败的节点。请配置好 /etc/resolv.conf 并持久化它。</li>
</ol>
<h3 id="etcresolvconf">持久化/etc/resolv.conf</h3><h1 id="mongodb">MongoDB</h1>
<p><a href="https://www.mongodb.com/">MongoDB</a> 是一种通用文档型数据库。在蓝鲸后台架构中，主要为以下平台提供存储服务：</p>
<ul>
<li>配置平台（CMDB）的核心数据</li>
<li>作业平台（Job）的执行日志</li>
<li>管控平台（GSE）的插件信息</li>
</ul>
<p>本文从安装部署到日常问题处理，描述 MongoDB 运维相关的内容。</p>
<h2 id="_1">安装部署</h2>
<p>蓝鲸的配置平台依赖 MongoDB 4.2 及以上版本，安装参考<a href="https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/">官方文档</a></p>
<ol>
<li>安装 rpm 包</li>
<li>配置 /etc/mongod.conf</li>
<li>创建必要的目录，设置好正确的权限</li>
<li>启动进程</li>
</ol>
<p>蓝鲸安装脚本使用 <code>./bin/install_mongodb.sh</code> 封装了这些步骤，简化安装。使用方法：</p>
<pre class="codehilite"><code class="language-bash">./bin/install_mongodb.sh -b &lt;本机IP&gt; -p 27017 -d &lt;MongoDB数据目录&gt; -l &lt;MongoDB日志目录&gt; </code></pre>


<h3 id="_2">生产环境配置</h3>
<p>蓝鲸默认部署的参数，并没有完全参考官方的生产环境配置来处理，因为混合部署了其他模块。假设用户给 MongoDB 单独的机器来搭建，可以参考官方的<a href="https://docs.mongodb.com/manual/administration/production-notes/">生产环境配置要求</a>:</p>
<h4 id="_3">硬件规格</h4>
<ul>
<li>给每个 MongoDB 实例分配至少 2 核 CPU</li>
<li>内存通过 /etc/mongod.conf 中的 storage.wiredTiger.engineConfig.cacheSizeGB 配置</li>
<li>SSD 磁盘</li>
</ul>
<h4 id="_4">系统配置</h4>
<p>关于 Swap，如果系统发生 swapping，会让 MongoDB 的性能受到影响，所以建议：</p>
<ol>
<li>不分配 swap 空间，并调整内核参数禁用 swap (vm.swappiness = 0)</li>
<li>分配 swap 空间，但是调整内核参数只当系统内存使用率非常高时才允许 swapping (vm.swappiness = 1)</li>
</ol>
<p>关于 ulimit 相关的配置，参考<a href="https://docs.mongodb.com/manual/reference/ulimit/">官方文档</a></p>
<h3 id="replicaset">ReplicaSet 集群配置</h3>
<p>通过前面的 <code>install_mongodb.sh</code> 安装的只是一个单实例的 MongoDB，而蓝鲸使用 MongoDB 的模式默认为 ReplicaSet，所以需要将单实例的 Mongod 变为 ReplicaSet 模式。
参考官方文档： <a href="https://docs.mongodb.com/v4.2/administration/replica-set-deployment/">集群搭建指南</a></p>
<p>值得一提的是，社区版为了节约资源，默认只配置了一台 MongoDB，如果资源充足，可以直接搭建三个节点的 MongoDB，组成高可用集群。</p>
<p>蓝鲸部署脚本为了简化配置，封装了脚本：<code>./bin/setup_mongodb_rs.sh</code> 分两步来完成：</p>
<ol>
<li>
<p>配置所有 MongoDB 单实例的机器，开启 key 认证</p>
<p>```bash</p>
<h1 id="_5">不带参数运行，会输出命令行的帮助信息</h1>
<h1 id="-a-action-config-init-configmongodbinit">[ -a, --action          [必填] "动作：[ config | init ] config的动作需要在多台mongodb实例上。init的动作只在任选一台上操作。 ]</h1>
<h1 id="-e-encrypt-key-config-key61024base64">[ -e, --encrypt-key     [必填] "动作为 config 时，指定内部集群认证的key，长度为6~1024的base64字符集的字符串" ]</h1>
<h1 id="_6"></h1>
<p>./bin/setup_mongodb_rs.sh -a config -e ${BK_MONGODB_KEYSTR_32BYTES}
```</p>
</li>
<li>
<p>在任意一台 MongoDB 实例上，执行 ReplicaSet 初始化命令：</p>
<p>```bash</p>
<h1 id="-j-join-init-ip357">[ -j, --join            [必填] "动作为 init 时，集群的ip列表逗号分隔，奇数（3，5，7）个" ]</h1>
<h1 id="-u-username-init-mongodb">[ -u, --username        [选填] "动作为 init 时，配置mongodb集群的超级管理员用户名。]</h1>
<h1 id="-p-password-init-mongodb">[ -p, --password        [选填] "动作为 init 时，配置mongodb集群的超级管理员密码。]</h1>
<h1 id="-p-port-init-mongodb27017">[ -P, --port            [选填] "动作为 init 时，配置mongodb的监听端口，默认为27017。]</h1>
<p>./bin/setup_mongodb_rs.sh -a init -j ${BK_MONGODB_IP_COMMA} -u $BK_MONGODB_ADMIN_USER -p $BK_MONGODB_ADMIN_PASSWORD -P 27017
```</p>
</li>
</ol>
<h3 id="consul">配置 Consul 服务名</h3>
<p>蓝鲸服务访问 MongoDB 使用域名链接，默认配置为 mongodb.service.consul 且 CMDB、GSE、Job 访问同一个 MongoDB 集群。严格的生产环境下，如果机器资源允许，建议各自访问独立的 MongoDB 集群实例。譬如按上面的步骤搭建三个集群，然后配置服务名分别为：mongodb-cmdb.service.consul、mongodb-gse.service.consul、mongodb-job.service.consul。</p>
<p>这里以默认的 mongodb.service.consul 为例，创建 consul 的服务定义文件如下，需要在组成集群的所有 MongoDB 实例机器上运行：</p>
<pre class="codehilite"><code class="language-bash">./bin/reg_consul_svc -n mongodb -p 27017 -a &lt;本机IP&gt; -D &gt; /etc/consul.d/service/mongodb.json

consul reload</code></pre>


<h3 id="_7">验证集群</h3>
<p>MongoDB 成功组成集群后，可以通过 <code>mongo</code> 命令行来连接。本文使用 <a href="https://docs.mongodb.com/manual/reference/connection-string/">mongodb uri 格式</a>来连接。</p>
<pre class="codehilite"><code class="language-bash">mongo mongodb://$BK_MONGODB_ADMIN_USER:$BK_MONGODB_ADMIN_PASSWORD@mongodb.service.consul:27017/?replicaSet=rs0</code></pre>


<p>如果能连上，会出现提示符：</p>
<pre class="codehilite"><code class="language-bash">rs0:PRIMARY&gt;</code></pre>


<p>输入命令查看 ReplicaSet 的状态：</p>
<pre class="codehilite"><code class="language-bash">rs0:PRIMARY&gt; rs.status().ok
1</code></pre>


<p>返回为 <strong>1</strong> 表示成功，<strong>0</strong> 表示失败</p>
<h2 id="_8">用户角色管理</h2>
<p>安装部署好集群后，默认只创建了超级管理员账号。接着需要给应用创建普通用户账号来访问对应的数据库。关于 MongoDB 用户角色管理参考<a href="https://docs.mongodb.com/manual/tutorial/manage-users-and-roles/">官方文档</a></p>
<p>蓝鲸部署脚本为了方便调用，封装了 <code>./bin/add_mongodb_user.sh</code> 脚本。用法如下：</p>
<pre class="codehilite"><code class="language-bash">用法: 
    add_mongodb_user.sh [ -h --help -?  查看帮助 ]
            [ -d, --db              [必填] &quot;授权的db名&quot;
            [ -i, --url             [必填] &quot;链接mongodb的url&quot;
            [ -u, --username        [必填] &quot;db的用户名&quot;
            [ -p, --password        [必填] &quot;db的密码&quot;
            [ -v, --version         [可选] &quot;查看脚本版本号&quot; ]</code></pre>


<ol>
<li>
<p>创建 cmdb 使用的账号（授权的 db 名为 cmdb）</p>
<p><code>bash
./bin/add_mongodb_user.sh -d cmdb -i mongodb://$BK_MONGODB_ADMIN_USER:$BK_MONGODB_ADMIN_PASSWORD@mongodb.service.consul:27017/admin?replicaSet=rs0 -u &lt;cmdb的访问用户名&gt; -p &lt;cmdb的访问密码&gt;</code></p>
</li>
<li>
<p>创建 gse 使用的账号（授权的 db 名为 gse）</p>
<p><code>bash
./bin/add_mongodb_user.sh -d gse -i mongodb://$BK_MONGODB_ADMIN_USER:$BK_MONGODB_ADMIN_PASSWORD@mongodb.service.consul:27017/admin?replicaSet=rs0 -u &lt;gse的访问用户名&gt; -p &lt;gse的访问密码&gt;</code></p>
</li>
<li>
<p>创建 job 使用的账号（授权的 db 名为 joblog）</p>
<p><code>bash
./bin/add_mongodb_user.sh -d joblog -i mongodb://$BK_MONGODB_ADMIN_USER:$BK_MONGODB_ADMIN_PASSWORD@mongodb.service.consul:27017/admin?replicaSet=rs0 -u &lt;job的访问用户名&gt; -p &lt;job的访问密码&gt;</code></p>
</li>
<li>
<p>创建集群监控用的账号：</p>
<p>```bash</p>
<h1 id="_9">请替换 <username> 和 <password></h1>
<p>cat &gt; create_monitor_user.js &lt;<EOF
use admin
db.createUser(
   {
     user: "<username>",
     pwd: "<password>",
     roles: [ { role: "clusterMonitor", db: "admin" } ]
   }
)
EOF</p>
<p>mongo mongodb://$BK_MONGODB_ADMIN_USER:$BK_MONGODB_ADMIN_PASSWORD@mongodb.service.consul:27017/admin?replicaSet=rs0 &lt; create_monitor_user.js
```</p>
<p>测试监控账号是否正常：</p>
<p><code>bash
mongostat --uri=mongodb://&lt;username&gt;:&lt;password&gt;@mongodb.service.consul:27017/admin</code></p>
</li>
</ol>
<h2 id="_10">配置文件</h2>
<p>mongod 默认安装的配置文件在 <code>/etc/mongod.conf</code> 中，如果需要修改，请参考官方文档的<a href="https://Vdocs.mongodb.com/v4.2/reference/configuration-options/">配置选项</a></p>
<p>修改后，需要重启进程生效：<code>systemctl restart mongod</code></p>
<h3 id="_11">日志滚动策略修改</h3>
<p>修改默认的日志滚动方式为 <code>reopen</code>，配合系统的 <code>logrotate</code> 来实现滚动。</p>
<ol>
<li>
<p>修改 /etc/mongod.conf 增加配置项 systemLog.logRotate 为 reopen：</p>
<p><code>bash
sed -i '/logAppend/a\    logRotate: reopen' /etc/mongod.conf</code></p>
</li>
<li>
<p>重启 mongod：<code>systemctl restart mongod</code></p>
</li>
<li>
<p>增加 logrotate 的配置（请根据实际日志路径修改 /var/log/mongodb/ 目录）</p>
<p><code>bash
cat &gt; /etc/logrotate.d/mongodb &lt;&lt;EOF 
/var/log/mongodb/*.log {
    daily
    rotate 14
    size 100M
    compress
    dateext
    missingok
    notifempty
    sharedscripts
    postrotate
        /bin/kill -SIGUSR1 `cat /var/run/mongodb/mongod.pid 2&gt; /dev/null` 2&gt; /dev/null || true
    endscript
}
EOF</code></p>
</li>
<li>
<p>通过强制滚动验证 logrotate 是否正常：</p>
<p><code>bash
logrotate --force /etc/logrotate.d/mongodb
ls -l /var/log/mongodb/</code></p>
</li>
</ol>
<h2 id="_12">常用操作</h2>
<ul>
<li>启动进程： <code>systemctl start mongod</code></li>
<li>停止进程： <code>systemctl stop mongod</code></li>
<li>设置开机启动：<code>systemctl enable mongod</code></li>
<li>命令行连上 ReplicaSet 的集群：<code>mongo mongodb://&lt;username&gt;:&lt;password&gt;@mongodb.service.consul:27017/admin?replicaSet=rs0</code></li>
<li>
<p>查看当前 RS 集群的主节点：</p>
<p><code>bash
mongo mongodb://&lt;username&gt;:&lt;password&gt;@mongodb.service.consul:27017/admin?replicaSet=rs0 --eval 'rs.status().members.find(r=&gt;r.state===1).name'</code></p>
</li>
</ul><h1 id="mysql">MySQL</h1>
<p><a href="https://www.mysql.com/">MySQL</a> 是一个通用型关系数据库。在蓝鲸后台架构中，主要为以下平台提供存储服务：</p>
<ul>
<li>PaaS 平台的核心数据</li>
<li>权限中心的核心数据</li>
<li>所有官方 SaaS 的核心存储</li>
<li>作业平台（Job）的核心存储</li>
</ul>
<p>本文从安装部署到日常维护，描述 MySQL 运维相关的内容。</p>
<h2 id="_1">安装部署</h2>
<p>蓝鲸使用 MySQL Community Server 5.7 版本，通过官方 rpm 包安装。</p>
<p>参考官方文档：<a href="https://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-rpm.html">Installing MySQL on Linux Using RPM Packages from Oracle</a></p>
<p>蓝鲸部署脚本为了简化部署和便于多 MySQL 实例管理，封装了脚本 <code>./bin/install_mysql.sh</code>，主要逻辑如下：</p>
<ol>
<li>安装服务端 rpm 包：mysql-community-server-5.7.27.rpm</li>
<li>创建必要的数据和日志目录，给 mysql 用户授权</li>
<li>生成自定义的 /etc/mysql/xxx.my.cnf 配置文件</li>
<li>生成 mysql@.service 和 mysql.target 两个 systemd unit，为了多实例管理。</li>
<li>第一次部署初始化数据库，并从日志文件中获取临时 root 密码</li>
<li>启动 mysqld 进程，并修改 root 密码为脚本命令行指定的密码</li>
</ol>
<p>关于 systemd 管理 MySQL 多实例可以参考官方文档：<a href="https://dev.mysql.com/doc/refman/5.7/en/using-systemd.html#systemd-multiple-mysql-instances">Managing MySQL Server with systemd</a></p>
<ol>
<li>定义一个 systemd service 的模板文件：/etc/systemd/system/mysql@.service （官方包有一个自带的 /usr/lib/systemd/system/mysqld@.service，蓝鲸部署脚本未使用这个定义文件）</li>
<li>根据传入的 MySQL 实例名，比如 <code>-n default</code>，生成 配置文件 /etc/mysql/default.my.cnf </li>
<li>使用命令行 <code>systemctl start mysql@default</code> 启动这个实例</li>
<li>使用命令行 <code>systemctl status mysql@default</code> 查看状态</li>
<li>使用命令行 <code>systemctl enable mysql@default</code> 配置开机启动</li>
</ol>
<p>假设启动失败，需要查看启动错误信息：</p>
<ol>
<li>查看 journalctl 的日志：<code>journalctl -u mysql@default</code></li>
<li>查看 mysqld 的日志：<code>/data/bkce/logs/mysql/default.mysqld.log</code></li>
</ol>
<h2 id="mysql_1">配置 MySQL 连接信息</h2>
<p>MySQL 运行成功后，在继续配置账户之前，先介绍下 <code>mysql</code> 命令行连接 mysqld 实例的方法: 利用 <code>mysql_config_editor</code> 命令生成 <code>~/.mylogin.cnf</code>，然后使用 <code>mysql --login-path=xxxx</code> 来登录。详见<a href="https://dev.mysql.com/doc/refman/5.7/en/mysql-config-editor.html">官方文档</a></p>
<p>mysql_config_editor 默认使用交互式来输入密码，部署脚本 <code>./bin/setup_mysql_loginpath.sh</code> 利用 expect 实现非交互式自动输入密码。</p>
<p>下面以配置 PaaS 平台使用的数据库为例介绍如何使用：</p>
<ol>
<li>
<p>配置本机使用 root 账号通过 mysql socket 来连接本机 mysqld 的配置</p>
<p><code>bash
./bin/setup_mysql_loginpath.sh -n default-root -h /var/run/mysql/default.mysql.socket -u root -p $BK_MYSQL_ADMIN_PASSWORD</code></p>
</li>
<li>
<p>使用 <code>mysql --login-path=default-root</code> 验证是否能以 root 用户连上 mysql</p>
</li>
</ol>
<h2 id="_2">授权访问</h2>
<p>配置好本机的 root 账号后，给需要访问它的主机授权访问，运行 mysql 的 grant 命令。
蓝鲸部署脚本为了简化授权，统一使用固定的脚本 <code>./bin/grant_mysql_priv.sh</code>，授权的 db 和表名为"<em>.</em>"。 </p>
<p>假设 paas 部署的主机 ip 为 <code>$BK_PAAS_IP</code>，需要访问的 mysqld 实例是上一节配置好的 <code>default-root</code>，paas 使用用户名<code>$BK_PAAS_MYSQL_USER</code>，密码为<code>$BK_PAAS_MYSQL_PASSWORD</code>。在 mysqld 主机上运行命令：</p>
<pre class="codehilite"><code class="language-bash">./bin/grant_mysql_priv.sh -n default-root -u &quot;$BK_PAAS_MYSQL_USER&quot; -p &quot;$BK_PAAS_MYSQL_PASSWORD&quot; -H &quot;$BK_PAAS_IP&quot;</code></pre>


<p>由于蓝鲸的部署模式是从中控机运行各个模块的 sql 文件导入，授权的时候，还需要添加上中控机的 IP 地址（$CTRL_IP）。</p>
<p>实际的部署脚本采取比较粗放的方式，给所有蓝鲸的机器授权所有的 DB 和表的权限。</p>
<h2 id="_3">配置中控机</h2>
<p>在完成授权后，中控机具备访问所有 MySQL 实例的账号权限。可以使用 <code>./bin/setup_mysql_loginpath.sh</code> 来配置各个 DB 的访问了。
虽然社区版只有一个 MySQL 实例，这是物理部署上原因。从逻辑部署上，蓝鲸的 MySQL 数据库是应该拆分为：</p>
<ul>
<li>mysql-paas: PaaS 后台和 SaaS 使用的实例。</li>
<li>mysql-job: 作业平台（job） 后台使用的实例。</li>
<li>mysql-iam: 权限中心（iam） 后台使用的实例。</li>
<li>mysql-ssm: 凭证管理（ssm） 后台使用的实例。</li>
<li>mysql-usermgr：用户管理（usermgr） 后台使用的实例。</li>
<li>mysql-nodeman: 节点管理（nodeman）后台使用的实例</li>
<li>mysql-monitor: 蓝鲸监控（monitorv3）后台使用的实例。</li>
<li>mysql-fta: 故障自愈（fta）后台使用的实例</li>
<li>mysql-ci: 蓝盾（ci）后台使用的实例</li>
</ul>
<p>这样逻辑拆分的目的是为了，假设用户资源充足，且使用某个后台的量级比较大，假设 mysql-monitor 需要拆分一个新的实例，这样只需要通过 <code>mysql_config_editor</code> 更新下 <code>mysql-monitor</code> 这个 login-path 的指向，无需修改脚本的参数。</p>
<p>以配置中控机上的 <code>mysql-paas</code> 为例：</p>
<pre class="codehilite"><code class="language-bash">./bin/setup_mysql_loginpath.sh -n mysql-paas -h &quot;$BK_PAAS_MYSQL_HOST&quot; -u &quot;$BK_PAAS_MYSQL_USER&quot; -p &quot;$BK_PAAS_MYSQL_PASSWORD&quot;</code></pre>


<h2 id="sql">SQL 文件管理</h2>
<p>部署依赖 MySQL 的后台第一步是创建库表结构，蓝鲸使用统一规范的目录存放后台包依赖的 sql 文件。</p>
<ul>
<li>./模块名/support-files/sql/4 位序号_工程_日期—时间_mysql.sql </li>
<li>./模块名/support-files/sql/子模块/4 位序号_工程_日期—时间_mysql.sql </li>
</ul>
<p>蓝鲸部署脚本封装导入 sql 的脚本为：<code>./bin/sql_migrate.sh</code> </p>
<p>以导入 open_paas 的 sql （<code>open_paas/support-files/sql/0001_open_paas_20180710-1600_mysql.sql</code>）为例：</p>
<pre class="codehilite"><code class="language-bash">./bin/sql_migrate.sh -n mysql-paas /data/src/open_paas/support-files/sql/*.sql</code></pre>


<p>以导入 job 的 sql（<code>job/support-files/sql/*/*.sql</code>）为例：</p>
<pre class="codehilite"><code class="language-bash">./bin/sql_migrate.sh -n mysql-job /data/src/job/support-files/sql/*/*.sql</code></pre>


<p>导入成功后，在 <code>~/.migrate/</code> 下生成同名 sql 文件的标记文件，并使用 <code>chattr +i</code> 限制删除，这样下次运行相同的<code>sql_migate.sh</code> 脚本时，会自动跳过已经导入成功的 sql 文件，实现蓝鲸后台的 sql migrate。</p>
<h2 id="_4">常用配置</h2>
<p>如果需要自定义 mysql 配置，请修改对应实例名的配置文件：/etc/mysql/实例名.my.cnf </p>
<p>配置选项含义参考<a href="https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html">官方文档</a></p>
<h2 id="_5">常见问题</h2><h1 id="zookeeper">Zookeeper</h1>
<p>Apache ZooKeeper 是 Apache 软件基金会的一个软件项目，为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。</p>
<p>蓝鲸后台产品中，使用到 Zookeeper 的有：</p>
<ul>
<li>cmdb 用作服务发现</li>
<li>gse 用作服务发现和 dataid 数据存储</li>
<li>蓝鲸监控 metadata 后台 读取 gse 的 dataid 数据部分</li>
</ul>
<h2 id="zookeeper_1">Zookeeper 入门</h2>
<p>这一节介绍如何安装 zookeeper，从单节点模式开始，熟悉一些基础的 zookeeper shell 操作。最后介绍如何搭建一个多节点的 Zookeeper 集群。</p>
<h3 id="zookeeper_2">Zookeeper 搭建</h3>
<p>Zookeeper 的 rpm 安装包在蓝鲸基础包中已经包含，可以方便的使用 yum 安装</p>
<ol>
<li>
<p>安装 JDK</p>
<p><code>bash
/data/install/bin/install_java.sh -p /data/bkce -f /data/src/java8.tgz</code></p>
</li>
<li>
<p>安装 Zookeeper</p>
<p><code>bash
/data/install/bin/install_zookeeper.sh -j zk_ip1 -b &lt;zk本机监听网卡地址&gt; -n 1</code></p>
</li>
<li>
<p>根据需要注册 consul 的服务名</p>
<p><code>bash
/data/install/bin/reg_consul_svc -n zk -p 2181 -a &lt;zk本机监听的网卡地址&gt; -D &gt; /etc/consul.d/service/zk.json
consul reload</code></p>
</li>
</ol>
<h3 id="zookeeper_3">Zookeeper 主要配置说明</h3>
<p>zookeeper 安装后，主配置在 /etc/zookeeper/zoo.cfg</p>
<pre class="codehilite"><code class="language-bash">$ cat /etc/zookeeper/zoo.cfg 
tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181</code></pre>


<p>配置项的含义分别是：</p>
<ul>
<li>
<p>tickTime: 它的单位是毫秒。用于会话注册以及客户端和 zookeeper 服务之间的心跳。最小的会话超时时间是两倍的 tickTime 值，上述配置即最小会话超时时间为 4 秒。</p>
</li>
<li>
<p>dataDir: 用于存储 Zookeeper 内存的状态数据；包括数据库的快照以及数据库更新的事务日志。解压 zookeeper 安装后不会自动生成 dataDir，你需要自己创建指定的目录，并赋予正确的读写权限。</p>
</li>
<li>
<p>clientPort: 用于监听客户端链接的端口。默认为 2181</p>
</li>
</ul>
<h3 id="zookeeper_4">启停 Zookeeper</h3>
<p>手动启动 Zookeeper:</p>
<pre class="codehilite"><code class="language-bash">systemctl start zookeeper</code></pre>


<p>等待几秒后，验证 Zookeeper 是否启动正常：</p>
<pre class="codehilite"><code class="language-bash">systemctl status zookeeper

/opt/zookeeper/bin/zkServer.sh status /etc/zookeeper/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/zoo.cfg
Mode: standalone</code></pre>


<p>停止 Zookeeper：</p>
<pre class="codehilite"><code class="language-bash">systemctl stop zookeeper</code></pre>


<h3 id="java-zk-shell">用 java 客户端连上 zk shell</h3>
<p>我们运行 zkCli.sh 来启动 Zookeeper 的命令行 java 客户端：</p>
<pre class="codehilite"><code class="language-bash">/opt/zookeeper/bin/zkCli.sh -server $ip:$port</code></pre>


<p>当我们连上 Zk server 后，我们会看到终端上有如下类似的输出：</p>
<pre class="codehilite"><code class="language-txt">Connecting to ....
....
Welcome to ZooKeeper!
JLine support is enabled

WATCHER::

WatchedEvent state:SyncConnected type:None path:null
[zk: x.x.x.x:2181(CONNECTED) 0] </code></pre>


<p>连上终端后，输入 help 命令，可以看到支持的命令和简明用法。</p>
<pre class="codehilite"><code class="language-bash">[zk: x.x.x.x:2181(CONNECTED) 0] help
ZooKeeper -server host:port cmd args
    stat path [watch]
    set path data [version]
    ls path [watch]
    delquota [-n|-b] path
    ls2 path [watch]
    setAcl path acl
    setquota -n|-b val path
    history 
    redo cmdno
    printwatches on|off
    delete path [version]
    sync path
    listquota path
    rmr path
    get path [watch]
    create [-s] [-e] path data acl
    addauth scheme auth
    quit 
    getAcl path
    close 
    connect host:port</code></pre>


<p>我们做一些简单的增删操作如下：</p>
<pre class="codehilite"><code class="language-bash">[zk: x.x.x.x:2181(CONNECTED) 0] ls /               
[cc, gse, zookeeper]
[zk: x.x.x.x:2181(CONNECTED) 1] create /helloworld &quot;&quot;  
Created /helloworld
[zk: x.x.x.x:2181(CONNECTED) 2] ls /
[cc, gse, helloworld, zookeeper]
[zk: x.x.x.x:2181(CONNECTED) 3] delete /helloworld
[zk: x.x.x.x:2181(CONNECTED) 4] ls /
[cc, gse, zookeeper]
[zk: x.x.x.x:2181(CONNECTED) 5] </code></pre>


<p>其实要理解这些命令的操作，需要适当了解下 zookeeper 的内部机制和数据模型。后面会简单介绍一下。</p>
<p>下面我们先看看如何从单节点模式到集群模式的 Zookeeper</p>
<h2 id="zookeeper_5">搭建多节点 Zookeeper 集群</h2>
<p>单节点模式的话，如果这个实例挂了，依赖它的应用都会受到影响。所以生产环境下，我们一般使用集群模式保证高可用。生产环境下，多个 zk 节点部署在不同的服务器上，组成一个集群。最小的节点数为 3，正式环境一般使用 5 台。组成的集群中，zk 实例以 leader/follower 的模式运行，一个节点会被选举为 leader，其余则为 follower。如果 leader 节点挂了，leader 重新选举，另外一个运行节点被选举为新的 leader。</p>
<h3 id="_1">多实例配置说明</h3>
<p>多节点集群的 zk 配置和单实例的类似，只是多了几行，示例如下：</p>
<pre class="codehilite"><code class="language-bash">tickTime=2000
dataDir=/var/lib/zookeeper
clientPort=2181
initLimit=5
syncLimit=2
server.1=zoo1:2888:3888
server.2=zoo2:2888:3888
server.3=zoo3:2888:3888</code></pre>


<p>新增的 2 个配置参数为：</p>
<ul>
<li>initLimit: follower 和 leader 之间初始链接时限，单位是 tick（tickTime），超时则链接失败。</li>
<li>syncLimit: follower 和 leader 请求和应答的时限，单位是 tick，超时则 follower 会被丢弃。链接到这台 follower 的客户端将链接到另外一个可用的 follower</li>
<li>另外新增的三行配置是 <code>server.id=host:port:port</code> 形式。其中<code>.id</code>是集群中主机的数字标识，在我们的例子中，zoo1 这台主机分配了数字<code>1</code>作为标识。</li>
</ul>
<p>这个数字标识需要通过 zk 服务器的数据目录（dataDir）下一个名为<code>myid</code>的配置文件指定。它里面应该仅仅包含一行文本，仅写入 ID 信息。id 的取值范围是 1 到 255</p>
<p>host 字段可以是主机名（需要能解析到 ip），也可以直接填写 ip 地址。</p>
<p>两个端口号 2888 和 3888，分别表示：</p>
<ul>
<li>第一个是 2888，集群内节点间通信用的端口，比如 leader 和 follower 之间交换信息用的端口。</li>
<li>第二个是 3888，用于 leader 选举。</li>
</ul>
<h3 id="_2">启动多台实例</h3>
<p>在配置好多台实例的 zoo.cfg 和 myid 配置文件后，我们依次启动它们。启动方式和单台节点的操作完全一摸一样。依次登陆 zoo1,zoo2,zoo3，然后运行下面的命令</p>
<pre class="codehilite"><code class="language-bash">systemctl start zookeeper
/opt/zookeeper/bin/zkServer.sh status /etc/zookeeper/zoo.cfg</code></pre>


<p>下面是在一个三台节点集群的 status 的输出：</p>
<pre class="codehilite"><code class="language-txt">[zoo1] # /opt/zookeeper/bin/zkServer.sh status /etc/zookeeper/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/zoo.cfg
Mode: follower
[zoo2] # /opt/zookeeper/bin/zkServer.sh status /etc/zookeeper/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/zoo.cfg
Mode: leader
[zoo3] # /opt/zookeeper/bin/zkServer.sh status /etc/zookeeper/zoo.cfg
ZooKeeper JMX enabled by default
Using config: /etc/zookeeper/zoo.cfg
Mode: follower</code></pre>


<p>可以看到 zoo2 这台机器被选举为集群 leader，而 zoo1 和 zoo3 为 follower</p>
<p>用命令行客户端链接集群和单节点一样，只不过连接串可以换成 host1:port1,host2:port2...这样的参数传递给-server:</p>
<pre class="codehilite"><code class="language-bash">./zkCli.sh -server zoo1:2181,zoo2:2181,zoo3:2181
Welcome to ZooKeeper!
… … … …
[zk: zoo1:2181,zoo2:2181,zoo3:2181 (CONNECTED) 0]</code></pre>


<p>zk 集群启动正常后，可以通过 JMX（Java Management Extensions）或者“四字命令“来监控集群信息。后面会简单介绍下。</p>
<h3 id="_3">在单台机器上启动多实例组成集群</h3>
<p>在单台机器上启动多实例也是可行的，用来做一些集群测试时有用。这里简单介绍下。下面是一个示例配置文件：</p>
<pre class="codehilite"><code class="language-bash">tickTime=2000
initLimit=5
syncLimit=2
dataDir=/var/lib/zookeeper
clientPort=2181
server.1=localhost:2666:3666
server.2=localhost:2667:3667
server.3=localhost:2668:3668</code></pre>


<p>既然时单机，我们直接用 localhost 主机名，其次两个 port 号为了避免冲突，每个实例都改得不一样。最后最重要的一个 dataDir 配置，因为在同一台机器上，我们需要区分目录。</p>
<p>第一个实例配置 zoo1.cfg</p>
<pre class="codehilite"><code class="language-bash">...
clientPort=2181
dataDir=/var/lib/zookeeper/zoo1
...</code></pre>


<p>第二个实例配置 zoo2.cfg</p>
<pre class="codehilite"><code class="language-bash">...
clientPort=2182
dataDir=/var/lib/zookeeper/zoo2
...</code></pre>


<p>第三个实例配置 zoo3.cfg</p>
<pre class="codehilite"><code class="language-bash">...
clientPort=2183
dataDir=/var/lib/zookeeper/zoo3
...</code></pre>


<p>然后我们将 zoo1.cfg,zoo2.cfg,zoo3.cfg 都放到/opt/zookeeper/conf/下。并创建/var/lib/zookeeper/zoo{1,2,3}目录，然后生成 myid 文件：</p>
<pre class="codehilite"><code class="language-bash">mkdir -p /var/lib/zookeeper/zoo{1,2,3}
echo 1 &gt; /var/lib/zookeeper/zoo1/myid
echo 2 &gt; /var/lib/zookeeper/zoo1/myid
echo 3 &gt; /var/lib/zookeeper/zoo1/myid</code></pre>


<p>然后指定配置文件启动实例：</p>
<pre class="codehilite"><code class="language-bash">/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo1.cfg
/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo2.cfg
/opt/zookeeper/bin/zkServer.sh start /opt/zookeeper/conf/zoo3.cfg</code></pre>


<p>启动成功后，我们使用命令行连上本地集群：</p>
<pre class="codehilite"><code class="language-bash">./zkCli.sh -server localhost:2181,localhost:2182,localhost:2183</code></pre>


<h2 id="zookeeper_6">理解 Zookeeper 内部工作机制</h2>
<h3 id="zookeeper_7">ZooKeeper 服务架构</h3>
<p>Apache ZooKeeper 是用来解决分布式应用得各组件之间的协调问题。它提供的是一些简单但是够用的原子接口，实际应用根据自身需要调用这些接口来实现分布应用中的状态同步、集群配置管理、集群成员管理等问题。</p>
<p><img alt="img" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/zkservice.jpg" /></p>
<p>从图中可以看出，ZooKeeper Service 是一组 Server 组成的集群对外提供的服务。client 访问这个服务时通过 TCP 连上其中的一台 server，发生请求，收到返回，收到通知，定时发送心跳。</p>
<h3 id="zookeeper_8">ZooKeeper 数据模型</h3>
<p>ZooKeeper 提供一个分层的命名空间，让分布式进程共享数据寄存，从而达到协调的作用。这个分层命名空间很像 Unix 的文件系统结构。数据寄存器（data register）在 ZooKeeper 的术语中叫做 Znode。下图是一个示例</p>
<p><img alt="The ZooKeeper data model" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/zk_data_model.jpg" /></p>
<p>从图中可以看出：</p>
<ul>
<li>根节点有一个叫/zoo 的子节点，而它下面有三个子节点</li>
<li>每个 znode 都通过路径来标识，路径通过/来分隔</li>
<li>znode 叫做数据寄存器，是因为它能存储数据。因此，一个 znode 节点可以既有数据，又有子 znode 节点。这点和文件系统更像了。</li>
</ul>
<p>znode 中的数据用 byte 形式存储，每个 znode 节点能存储的最大数据大小不超过 1MB。因为 Zookeeper 应用场景不是存储大量数据。单节点存储不超过 1M 对于 zookeeper 的场景足够适用。</p>
<p>znode 的路径必须是绝对路径开始，不支持相对路径。znode 的名称中不能包含"."，</p>
<p>和文件系统一样，znode 维护一个数据结构来描述自身的状态，包含记录数据变化的版本号和访问权限控制列表等。</p>
<h3 id="znode">znode 的类型</h3>
<p>ZooKeeper 有两种 znode：持久节点和临时节点。还有一种类型，更准确说是前两种节点类型的一个属性，叫做顺序节点。持久节点和临时节点都可以是顺序节点，这样一组合就有四种节点类型了。znode 节点的类型是在创建时确定的。</p>
<h4 id="_4">持久节点</h4>
<p>持久节点在 ZooKeeper 的命名空间中一直存在，除非被删除。znode 节点的删除，可以调用<code>delete</code>的 API。并不只有创建这个节点的客户端才能删除，任何授权客户端都能删除一个 znode。</p>
<p>我们实践一下：</p>
<pre class="codehilite"><code class="language-bash">[zk: localhost(CONNECTED) 1] create /bk &quot;blueking&quot;
Created /bk
[zk: localhost(CONNECTED) 2] get /[bk]
blueking</code></pre>


<p>持久节点适用于需要高可用，能被所有应用访问获取的数据信息。例如应用的配置信息。这些信息在客户端断开后，也会一直保留在 znode 节点中。</p>
<h4 id="_5">临时节点</h4>
<p>临时节点和持久节点相反，创建它的客户端会话结束后，该节点会被 ZooKeeper 删除。客户端的会话结束可能是客户端异常，或者网络连接断开。虽然临时节点和客户端会话有关，但是它在权限范围内对其他客户端都是可见的。</p>
<p>临时节点也可以显式的用<code>delete</code>方法删除。由于临时节点在客户端会话结束后会自动删除，当前版本的 Zookeeper 不允许创建临时节点的子节点。</p>
<p>要创建临时节点，在 create 方法后加上"-e"参数：</p>
<pre class="codehilite"><code class="language-bash">[zk: localhost:2181(CONNECTED) 1] create -e /bk &quot;blueking&quot;
Created /bk</code></pre>


<p>验证下是否可以创建子节点：</p>
<pre class="codehilite"><code class="language-bash">[zk: localhost:2181(CONNECTED) 2] create -e /bk/paas &quot;blueking&quot;
Ephemerals cannot have children: /bk/paas</code></pre>


<p>临时节点的概念很适合用做分布式集群的管理。当一个客户端退出时，断开 zk 的会话，zk 自动删除它创建的临时节点，从而集群中其他节点知道这个客户端离开了集群。</p>
<h4 id="_6">顺序节点</h4>
<p>顺序节点类型，在 Zookeeper 创建时，会自动在 znode 名字后加上序列号。序列号由父节点维护，它是全局自增的。
序列的计数器由 10 个数字（用 0 填充）组成。例如：/path/to/znode-0000000001</p>
<p>由于持久和临时节点都是顺序节点，所以我们一共有四种节点：</p>
<ul>
<li>持久节点</li>
<li>临时节点</li>
<li>持久顺序节点</li>
<li>临时顺序节点</li>
</ul>
<p>使用命令行创建顺序节点，我们使用<code>-s</code>参数：</p>
<pre class="codehilite"><code class="language-bash">[zk: localhost:2181(CONNECTED) 1] create /bk_seq &quot;&quot;             
Created /bk_seq
[zk: localhost:2181(CONNECTED) 2] create -s /bk_seq/node &quot;foo&quot;
Created /bk_seq/node0000000000
[zk: localhost:2181(CONNECTED) 3] create -s -e /bk_seq/node &quot;bar&quot;
Created /bk_seq/node0000000001</code></pre>


<h3 id="zookeeper-watches">ZooKeeper Watches</h3>
<p>ZooKeeper 实现了一种机制，当有 znode 发送变化时，主动通知客户端，而不是客户端轮询 Zookeeper。</p>
<p>客户端可以向 Zk 注册有关任意 znode 的事件通知。这种注册，在 zk 术语里叫做 setting a watch。watch 是一次性的操作，意味着只触发一次通知。如果需要继续收到主动推送的通知，客户端需要重新注册需要 watch 的事件。</p>
<p>我们以一个集群的节点模型来展示 watch 和通知的概念：</p>
<ul>
<li>在集群中，一个节点，假设名为 Client1，想在集群有新节点加入时收到这个事件的通知。这里的设计是，任一节点加入集群会在/Members 下创建一个临时节点。</li>
<li>现在，第二个节点，名为 Client2，加入了集群然后在/Members 下创建了一个临时节点叫 node2</li>
<li>Client1，向 Zk 的/Members 节点发起<code>getChild</code>的指令，然后对/Members 设置了一个任意事件的 watch。当 Client2 在/Members 下创建了 znode：/Members/Host2 时，这个 watch 触发，于是 Client1 从 Zk 服务收到了通知，于是它看到了集群新增了 Host2 这个 znode。下图说明了整个流程</li>
</ul>
<p><img alt="" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/zk_watch_flow.jpg" /></p>
<p>Zk 的 watch 是一次性的。如果一个客户端收到了一个 watch 的通知后，还想接受后续事件通知，它必须重新设置一个 watch。</p>
<p>在 znode 发生以下三种改变时，会触发通知：</p>
<ol>
<li>任何改变 znode data 的操作。例如使用 set 命令来设置 znode 的 data 数据时。</li>
<li>任何改变 znode 子节点的操作。例如一个 znode 的子节点被 delete 删除。</li>
<li>znode 创建或删除。</li>
</ol>
<h3 id="zookeeper_9">ZooKeeper 操作</h3>
<p>Zookeeper 的数据模型和 API 支持下列 9 种基本操作：</p>
<ul>
<li>create： 创建 znode</li>
<li>delete：删除 znode</li>
<li>exists: 判断 znode 是否存在</li>
<li>getChildren：返回子节点列表</li>
<li>getData: 获取 znode 的数据</li>
<li>setData: 设置 znode 的数据</li>
<li>getACL: 获取 znode 的 ACL</li>
<li>setACL: 设置 znode 的 ACL</li>
<li>sync：使当前 client 连接的 zookeeper server 从 leader 节点同步下数据</li>
</ul>
<p>我们使用 zk 的命令行来演示基本操作：</p>
<ol>
<li>
<p>创建名为/blueking 的 znode，设置它的数据为"Tencent Blueking"</p>
<p><code>bash
[zk: localhost(CONNECTED) 0] create /root "ThisIsTheRootNode"
Created /root</code></p>
</li>
<li>
<p>获取刚才创建的 znode /blueking 的数据</p>
<p><code>bash
[zk: localhost:2181(CONNECTED) 1] get /blueking
Tencent Blueking</code></p>
</li>
<li>
<p>给/blueking 增加一个名为 paas 的子节点，数据为"This is PaaS"</p>
<p><code>bash
[zk: localhost:2181(CONNECTED) 2] create /blueking/paas "This is PaaS"
Created /blueking/paas</code></p>
</li>
<li>
<p>给/blueking 增加一个名为 cmdb 的子节点，数据为"This is CMDB"</p>
<p><code>bash
[zk: localhost:2181(CONNECTED) 3] create /blueking/cmdb "This is CMDB"
Created /blueking/cmdb</code></p>
</li>
<li>
<p>列出/blueking 的子节点</p>
<p><code>bash
[zk: localhost:2181(CONNECTED) 4] ls /blueking
[cmdb, paas]</code></p>
</li>
<li>
<p>列出/blueking 的访问控制列表信息</p>
<dl>
<dt>```bash</dt>
<dt>[zk: localhost:2181(CONNECTED) 5] getAcl /blueking</dt>
<dt>'world,'anyone</dt>
<dd>cdrwa
```</dd>
</dl>
</li>
<li>
<p>删除/blueking 节点，会报错，因为它还有子节点</p>
<p><code>bash
[zk: localhost:2181(CONNECTED) 6] delete /blueking
Node not empty: /blueking</code></p>
</li>
<li>
<p>删除 paas 和 cmdb 两个子节点</p>
<p><code>bash
[zk: localhost:2181(CONNECTED) 7] delete /blueking/paas
[zk: localhost:2181(CONNECTED) 8] delete /blueking/cmdb
[zk: localhost:2181(CONNECTED) 9] ls2 /blueking
[]</code></p>
</li>
<li>
<p>删除 blueking 节点</p>
<p><code>bash
[zk: localhost:2181(CONNECTED) 10] delete /blueking</code></p>
</li>
</ol>
<p>下图显示 ZooKeeper 的读写操作</p>
<p><img alt="The ZooKeeper operations" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/zk_read_write_op.jpg" /></p>
<p>图中可以看出 2 点非常重要的：</p>
<ul>
<li>读请求：client 连接的 zookeeper server 本地直接返回</li>
<li>写请求：在返回写入成功的相应之前，会将写请求传递给集群 leader，并确保多数节点成功。</li>
</ul>
<h3 id="zookeeper_10">ZooKeeper 访问控制列表</h3>
<h3 id="zookeeper_11">ZooKeeper 运维的最佳实践</h3>
<ol>
<li>zookeeper 的 datadir 存储了快照和事务日志文件。最好定时清理，如果 autopurge 选项没有设置的话。运维可以根据开发要求与否，备份这些文件。不过由于 zookeeper 集群是数据冗余的，所以备份一台 server 节点的即可。</li>
<li>zookeeper 使用 apache log4j 作为日志框架。日志文件建议配置好自动轮滚，防止占用太多空间。</li>
<li>zookeeper 集群 zoo.cfg 里配置的 server list 应该每台机器保持一致</li>
<li>客户端连接 zookeeper 集群用的连接串应该和配置的 server list 保持一致，否则可能会有奇怪的问题产生。</li>
<li>transaction 的日志最好存储在性能比较好的磁盘分区上。</li>
<li>java 的 heap size 设置正确。zookeeper 机器上不应该发生 Swapping。</li>
</ol>
<h3 id="zookeeper_12">ZooKeeper 监控</h3>
<h2 id="zookeeper_13">蓝鲸使用 Zookeeper 中的关键路径说明</h2>
<ul>
<li>CMDB 的服务发现：/cc/services/endpoints/</li>
<li>GSE 的基础节点信息，参考创建的脚本：<code>bin/create_gse_zk_base_node.sh</code></li>
<li>GSE 的 dataid 存储信息，/gse/config/etc/dataserver/data/<dataid></li>
</ul>
<!-- markdown-link-check-disable -->

<p>www.baidu.com</p>
<!-- markdown-link-check-enable --><h1 id="kafka">Kafka</h1>
<p>Kafka 在蓝鲸架构中，用于数据上报通道的队列缓存。在数据链路中，生产者是 GSE 组件的 <code>gse_data</code> 进程，将 agent 上报的监控时序数据或者日志采集数据
写入到 kafka 集群。消费者是监控后台的 <code>transfer</code> 进程，将队列中的数据消费，清洗，并入库到相应存储中。</p>
<h2 id="kafka_1">Kafka 搭建</h2>
<ol>
<li>搭建 kafka 使用的 Zookeeper 集群。（详见：<a href="./zookeeper.md">Zookeeper</a>）</li>
<li>安装 JDK</li>
</ol>
<p><code>bash
   /data/install/bin/install_java.sh -p /data/bkce -f /data/src/java8.tgz</code></p>
<ol>
<li>安装 kafka</li>
</ol>
<p><code>bash
   /data/install/bin/install_kafka.sh -j kafka_ip1,kafka_ip2,kafka_ip3 -z zk1_ip1,zk_ip2,zk_ip3/common_kafka -b &lt;kafka本机监听的网卡地址&gt; -d /data/bkce/public/kafka -p 9092</code></p>
<ol>
<li>根据需要注册 consul 的服务名</li>
</ol>
<p><code>bash
   /data/install/bin/reg_consul_svc -n kafka -p 9092 -a &lt;kafka本机监听的网卡地址&gt; -D &gt; /etc/consul.d/service/kafka.json
   consul reload</code></p>
<h2 id="kafka_2">Kafka 常用操作</h2>
<ul>
<li>查看 topics：<code>/opt/kafka/bin/kafka-topics.sh --describe --zookeeper zk.service.consul:2181/common_kafka</code></li>
<li>查看 topic 配置：<code>/opt/kafka/bin/kafka-configs.sh --zookeeper zk.service.consul:2181/common_kafka --entity-type topics --entity-name snapshot2 --describe</code></li>
<li>修改 per-topic 配置：<a href="http://kafka.apache.org/documentation.html#topicconfigs">官方文档</a> <code>/opt/kafka/bin/kafka-configs.sh --zookeeper zk.service.consul:2181/common_kafka --entity-type topics --entity-name snapshot2 --alter --add-config retention.bytes=1073741824</code></li>
</ul>
<h2 id="kafka_3">Kafka 扩容</h2>
<p>当接入的数据越来越多，原有的 broker，cpu 和磁盘均告急时，需要扩容 broker 来缓解 kafka 压力。</p>
<p>Kafka 官方文档关于扩容集群的说明见：https://kafka.apache.org/0100/documentation.html#basic_ops_cluster_expansion</p>
<p>在蓝鲸下可以使用以下步骤来完成扩容：</p>
<ol>
<li>如果是新机器，请先按照通用的扩容步骤，做好初始化。（详见：<a href="./scale_node.md">组件扩容</a>）</li>
<li>通过 yum 安装 kafka：<code>yum -y install kafka</code> 应该会从 bk-custom 这个仓库中安装 kafka 0.10.2.0 版本</li>
<li>将原 kafka 机器的 /etc/kafka/server.properties 文件拷贝到新节点，并修改内网 ip 地址和 <code>broker.id</code> 的配置，id 在 kafka 集群中必须保持唯一。</li>
<li>创建必要数据目录：<code>install -d -o kafka -g kafka /data/bkce/public/kafka</code></li>
<li>启动 kafka：<code>systemctl enable --now kafka</code></li>
<li>可以在 zk 的节点上(/brokers/ids)确认新扩容的 kafka 的 broker id 出现。</li>
</ol>
<p>扩容完成后，新的 broker，如果没有新的 Topic 创建，它不会承载任何数据，除非手动迁移老的数据到新的 broker。</p>
<p>现在假设按整个 topic 迁移到新的 broker 上。待迁移的topic名字为 "0bkmonitor_5243810" 和 "0bkmonitor_5243810"，目标 broker 为 "4,5"</p>
<ol>
<li>
<p>编辑 ~/topic.json </p>
<p><code>json
{"topics": [{"topic": "0bkmonitor_5243810"},
        {"topic": "0bkmonitor_5244020"}],
"version":1
}</code></p>
</li>
<li>
<p>运行命令生成 json 描述</p>
<p>```bash
$ cd /opt/kafka 
$ bin/kafka-reassign-partitions.sh --zookeeper zk.service.consul/common_kafka --topics-to-move-json-file ~/topic.json --broker-list "4,5" --generate
Current partition replica assignment
{"version":1,"partitions":[{"topic":"0bkmonitor_5243810","partition":0,"replicas":[1,2]},{"topic":"0bkmonitor_5244020","partition":0,"replicas":[2,1]}]}</p>
<p>Proposed partition reassignment configuration
{"version":1,"partitions":[{"topic":"0bkmonitor_5243810","partition":0,"replicas":[5,4]},{"topic":"0bkmonitor_5244020","partition":0,"replicas":[5,4]}]}
```</p>
</li>
<li>
<p>拷贝上一步输出中 "Proposed partition reassignment configuration" 行下方的 json 到文件 ~/reasign_topic.json </p>
</li>
<li>
<p>运行命令发起重分配</p>
<p>```bash
$ cd /opt/kafka
$ ./bin/kafka-reassign-partitions.sh --zookeeper zk.service.consul/common_kafka --reassignment-json-file ~/reasign_topic.json  --execute
Current partition replica assignment</p>
<p>{"version":1,"partitions":[{"topic":"0bkmonitor_5243810","partition":0,"replicas":[1,2]},{"topic":"0bkmonitor_5244020","partition":0,"replicas":[2,1]}]}</p>
<p>Save this to use as the --reassignment-json-file option during rollback
Successfully started reassignment of partitions.
```</p>
</li>
<li>
<p>可以使用 <code>--verify</code> 参数确认重分配的进度</p>
<p><code>bash
$ ./bin/kafka-reassign-partitions.sh --zookeeper zk.service.consul/common_kafka --reassignment-json-file ~/reasign_topic.json  --verify
Status of partition reassignment: 
Reassignment of partition [0bkmonitor_5243810,0] is still in progress
Reassignment of partition [0bkmonitor_5244020,0] is still in progress</code></p>
</li>
</ol><h1 id="rabbitmq">RabbitMQ</h1>
<p>RabbitMQ 是实现了高级消息队列协议（AMQP）的开源消息代理软件（亦称面向消息的中间件）。</p>
<p>在蓝鲸组件中，以下产品依赖 RabbitMQ 服务：</p>
<ul>
<li>PaaS 平台（需要注册 RabbitMQ 服务，提供给通过 PaaS 平台部署的 SaaS 用）</li>
<li>后台 Django 工程使用 celery 任务的 （节点管理、用户管理、监控平台等）</li>
<li>作业平台（job）</li>
<li>蓝盾（bkci）</li>
</ul>
<h2 id="rabbitmq_1">安装 RabbitMQ</h2>
<p>rabbitmq-server 在 EPEL 仓库里存在，不过一般版本会比较旧，蓝鲸提供的 rpm 包中包含了较新的版本。</p>
<p>通过 yum 直接安装，自动解决 erlang 依赖:</p>
<pre class="codehilite"><code class="language-bash">yum install rabbitmq-server</code></pre>


<p>如果想安装官方最新的版本，可以通过<code>rpm</code>的方式手动安装。推荐使用 RabbitMQ 官方提供的精简版
Erlang/OTP 的 rpm 包作为依赖：</p>
<ol>
<li>
<p>从这里下载最新的 CentOS 对应版本的 Erlang rpm 包：https://github.com/rabbitmq/erlang-rpm/releases 比如 Centos7 下就下载 erlang-21.3.7-1.el7.x86_64.rpm 这个文件</p>
<p><code>bash
wget https://github.com/rabbitmq/erlang-rpm/releases/download/v21.3.7/erlang-21.3.7-1.el7.x86_64.rpm</code></p>
</li>
<li>
<p>从官网下载最新的 rabbitmq-server rpm 包：https://www.rabbitmq.com/install-rpm.html#downloads</p>
<p><code>bash
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14-1.el7.noarch.rpm</code></p>
</li>
<li>
<p>安装 rabbitmq-server 3.7 以上的版本需要满足以下依赖包，可以通过 yum 安装：</p>
<p><code>bash
yum install socat logrotate</code></p>
</li>
<li>
<p>安装 erlang 虚拟机：</p>
<p><code>bash
rpm -ivh erlang-21.3.7-1.el7.x86_64.rpm</code></p>
</li>
<li>
<p>安装 rabbitmq-server:</p>
<p><code>bash
rpm -ivh rabbitmq-server-3.7.14-1.el7.noarch.rpm</code></p>
</li>
<li>
<p>启动 rabbitmq-server:</p>
<p><code>bash
systemctl start rabbit-server</code></p>
</li>
<li>
<p>查看状态: </p>
<p><code>bash
rabbitmqctl status</code></p>
</li>
</ol>
<h2 id="rabbitmq_2">配置 RabbitMQ</h2>
<p>正确配置好 rabbitmq 是运维 rabbitmq 非常重要的一环。它影响到 rabbitmq 运行的性能，高可用和可扩展性。</p>
<p>配置 RabbitMQ，有三种途径：</p>
<ul>
<li>环境变量: 配置网络相关参数和文件路径。</li>
<li>配置文件：权限，资源限制，插件以及集群相关配置</li>
<li>运行时参数：配置可能在运行时需要动态调整的参数</li>
</ul>
<p>开始进行配置前，我们检查默认的配置文件是否存在，在 Linux 下，一般是：</p>
<pre class="codehilite"><code class="language-bash">/etc/rabbitmq/rabbitmq.conf</code></pre>


<p>从 RabbitMQ 3.7 版本开始，它默认的配置文件格式是 <a href="https://github.com/basho/cuttlefish/wiki/Cuttlefish-for-Application-Users">sysctl 格式</a></p>
<h3 id="_1">环境变量</h3>
<p>Linux 下，我们通过一个名为 <code>rabbitmq-env.conf</code> 的文件来配置 rabbitmq-server 相关的路径，网络参数等。在这个文件中，我们这样添加参数：</p>
<pre class="codehilite"><code class="language-bash">CONFIG_FILE=/etc/rabbitmq/testfile</code></pre>


<p>修改后，需要重启 rabbitmq-server 让它们生效。</p>
<p>rabbitmq 提供了大量的环境变量参数来配置，这里我们只介绍比较重要的几个：</p>
<ul>
<li><strong>RABBITMQ_CONFIG_FILE</strong>: 虽然 rabbitmq 有默认读取配置文件的路径，你依然可以通过这个变量来修改它。</li>
<li><strong>RABBITMQ_LOGS</strong>: 这个变量定义后台日志存放的路径。</li>
<li><strong>RABBITMQ_NODE_IP_ADDRESS</strong>: rabbitmq 默认监听所有的网卡地址，如果需要只绑定特定的网卡 IP，可以用这个变量指定。</li>
<li><strong>RABBITMQ_NODE_PORT</strong>: rabbitmq 默认的端口是 5672。如果有冲突时，可以使用它来修改。</li>
<li><strong>RABBITMQ_NODENAME</strong>: 这是 rabbitmq 服务的节点名称，它在每个 erlang 节点上必须唯一。Linux 上默认为 rabbit@hostname</li>
<li><strong>RABBITMQ_SASL_LOGS</strong>: 这是 rabbitmq 服务的 System Application Support Libraries(SASL) 的日志文件路径。</li>
</ul>
<p>Linux 下这些环境变量的默认值：</p>
<ul>
<li>RABBITMQ_CONFIG_FILE ${install_prefix}/etc/rabbitmq/rabbitmq</li>
<li>RABBITMQ_NODENAME rabbit@$HOSTNAME</li>
<li>RABBITMQ_LOG_BASE ${install_prefix}/var/log/rabbitmq</li>
<li>RABBITMQ_LOGS $RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME.log</li>
<li>RABBITMQ_MNESIA_BASE ${install_prefix}/var/lib/rabbitmq/mnesia</li>
<li>RABBITMQ_MNESIA_DIR $RABBITMQ_MNESIA_BASE/$RABBIMQ_NODENAME</li>
<li>RABBITMQ_SASL_LOGS $RABBITMQ_LOG_BASE/$RABBITMQ_NODENAME-sasl.log</li>
</ul>
<h3 id="_2">配置文件</h3>
<p>上一节看出，rabbitmq 的环境变量主要控制一些文件目录的路径。而 rabbitmq 的配置文件，则控制后台引擎相关的配置。比如
权限认证，性能参数，内存资源限制，磁盘限制，exchanges，queues, bindings 等等。</p>
<p>和上一节一样，我们只讨论最重要的一些参数。</p>
<ul>
<li><strong>auth_mechanisms</strong>: 指定认证方式，默认值为 ['PLAIN', 'AMQPLAIN']</li>
<li><strong>default_user</strong>: 使用 rabbitmq 客户端访问 rabbitmq 服务端时用的默认用户名。默认为 guest</li>
<li><strong>default_pass</strong>: 和 rabbitmq_user 类似，默认用户名对应的默认密码。默认值为 guest</li>
<li><strong>default_permission</strong>: 默认用户名拥有的权限。默认值是<code>[".*", ".*", ".*"]</code></li>
<li><strong>disk_free_limit</strong>: rabbitmq 数据文件所在分区的磁盘限额，如果可用空间低于它，会触发访问限制。默认值是 50000000（Bytes）</li>
<li><strong>log_levels</strong>: 日志级别，默认值为 [{connection, info}]，可选值有：none, error, warning, info</li>
<li><strong>tcp_listeners</strong>: 配置绑定的 IP 和端口。默认值[5672]</li>
<li><strong>vm_memory_high_watermark</strong>: 空闲内存大小比率。默认为 0.4，即 4/10</li>
</ul>
<h3 id="_3">运行参数</h3>
<p>环境变量和配置文件这两种方式，提供在启动 rabbitmq 时的配置能力。在 rabbitmq 运行后，有一些参数，可以通过 rabbitmq 提供的命令行工具 <code>rabbitmqctl</code> 来调整配置。</p>
<h4 id="_4">参数管理</h4>
<ul>
<li>通过 <code>rabbitmqctl set_parameter [-p vhostpath] {component_name} {name} {value}</code> 这样的命令形式来配置参数。</li>
<li>通过 <code>rabbitmqctl clear_parameter [-p vhostpath] {component_name} {key}</code> 这样的命令形式来清除参数。</li>
</ul>
<h4 id="_5">策略管理</h4>
<p>策略管理用来配置 RabbitMQ 的消息队列运行时的一些策略值。这些策略配置可以影响 exchanges 和 queues 的默认行为。</p>
<ul>
<li>通过 <code>rabbitmqctl set_policy [-p vhostpath] [--priority priority] [--apply-to apply-to] {name} {pattern} {definition}</code> 这样的命令形式来配置策略。</li>
<li>通过 <code>rabbitmqctl clear_policy [-p vhostpath] {name}</code> 这样的命令形式来删除策略。</li>
</ul>
<h4 id="_6">内存管理</h4>
<p>上一节我们看到通过配置文件方式来指定<code>vm_memory_high_watermark</code>，rabbitmq 也提供了运行时动态调整它的方法：</p>
<p><code>rabbitmqctl set_vm_memory_high_watermark {fraction}</code></p>
<h2 id="amqp">AMQP 概念</h2>
<p>RabbitMQ 只是 AMQP(Advanced Message Queuing Protocol) 的一种实现，所以要理解 rabbitmq 的运维，需要简单了解下 AMQ 协议中的一些基础元素：</p>
<ul>
<li>Message Flow: 它指消息的整个生命周期。</li>
<li>Exchanges: 它从消息发布者中接受消息，然后路由到消息队列中（Message Queues）。</li>
<li>Message Queues: 它将消息存储在内存或磁盘，然后传递消息给对应的消费者。</li>
<li>Bindings: 它描述 exchange 和 message queue 的关系。如何将消息路由给正确的消息队列。</li>
<li>Virtual Hosts: 有点类似 web 服务器的 virtualhost，它是一个隔离独立的环境，拥有一组 users,exchanges,message queues 等。</li>
</ul>
<p><img alt="AMQP stack" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/AMQP_stack.jpg" /></p>
<h2 id="_7">集群和高可用</h2>
<p>RabbitMQ 有两种方式解决单机性能瓶颈：</p>
<ul>
<li>Federation/shovel</li>
<li>Cluster</li>
</ul>
<p>第一种 rabbitmq 是通过插件的方式实现。这里不做详细介绍。第二种 Cluster 的方式是 RabbitMQ 原生支持的。</p>
<p>集群模式下，所有的数据/状态都会被复制到所有节点达到高可用和可扩展性。</p>
<p>集群模式下的节点类型可以是内存型或者磁盘型。如果选择内存型，那么 rabbitmq 会将状态数据只保存在内存中。
选择磁盘的话，状态数据内存和磁盘都会保存。</p>
<h3 id="_8">节点名（标识）</h3>
<p>RabbitMQ 节点通过节点名称标识。节点名由两部分组成，一个前缀，通常叫 "rabbit"，一个主机名。例如：<code>rabbit@node1.svc.local</code> 这个节点名前缀是 <code>rabbit</code>，主机名是 <code>node1.svc.local</code>。</p>
<p>节点名在集群中必须唯一。在集群中，节点之间通过节点名来通信。这意味着主机名部分，必须每个节点都可以成功解析。</p>
<p>当节点启动时，它会检查是否给它分配了节点名（通过 RABBITMQ_NODENAME 环境变量），如果没有，它会自动生成 <code>rabbit@$(hostname -s)</code> 作为节点名。</p>
<p>如果系统使用 FQDN 作为主机名，rabbitmq 节点必须配置使用这种长的节点名。对于 server 节点，<code>RABBITMQ_USE_LONGNAME</code> 必须设置为<code>true</code>。对于命令行工具， 要么设置<code>RABBITMQ_USE_LONGNAME</code> 要么使用 <code>--longnames</code> 的开关。</p>
<h3 id="rabbitmq_3">RabbitMQ 节点有什么特点</h3>
<p>所有的节点之间都共享 RabbitMQ broker 所有需要数据和状态，除了消息队列。消息队列默认只存在一个节点上，虽然它们可以通过其他所有节点来访问。</p>
<p>如果要在节点之间共享复制消息队列，这里涉及到高可用和镜像队列配置，后面会提到。</p>
<p>和其他分布式系统存在 leader 和 follower 角色不同。RabbitMQ 不区分，所有节点都是一样的。</p>
<p>节点之间认证的方式是：Erlang Cookie 。 RabbitMQ 节点和命令行工具（比如 rabbitmqctl)，使用 cookie 来确保它们是否能相互通信。对于同一个集群的 rabbitmq 节点，它的内容需要保持一致，才能相互之间通信。 cookie 是一个长度不大于 255 的字符串。它存在本地文件中。该文件只能由 owner 访问。</p>
<p>对于 rabbitmq 服务端，它默认存储在 /var/lib/rabbitmq/.erlang.cookie，需要保证文件属性是 400，属主是 rabbitmq 的启动用户。</p>
<p>对于 rabbitmqctl 这个命令行客户端，它要和 rabbitmq 集群通信也需要使用同样的 <code>.erlang.cookie</code> 文件， 只不过路径不同，位于 <code>$HOME/.erlang.cookie</code> 。我们为三台节点生成同样的 erlang cookie 文件， 需要注意的是，<code>cookie=$(uuid -v4)</code> 只需要生成一次即可。其他机器必须使用相同的字符串。</p>
<pre class="codehilite"><code class="language-bash">cookie=$(uuid -v4)
echo -n &quot;$cookie&quot; &gt; /var/lib/rabbitmq/.erlang.cookie
echo -n &quot;$cookie&quot; &gt; $HOME/.erlang.cookie
chown rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie
chmod 400 /var/lib/rabbitmq/.erlang.cookie $HOME/.erlang.cookie</code></pre>


<h3 id="_9">创建集群</h3>
<p>假设有 3 台服务器，分别叫 opensrc-1, opensrc-2, opensrc-3 在 3 台上分别安装和启动 rabbitmq-server 进程。</p>
<p>配置好 erlang cookie 后，在三台服务器上分别启动服务端进程。</p>
<pre class="codehilite"><code class="language-bash">opensrc-1 $ systemctl start rabbitmq-server
opensrc-2 $ systemctl start rabbitmq-server
opensrc-3 $ systemctl start rabbitmq-server</code></pre>


<p>然后在每一台机器上运行 cluster_status 指令来确认单节点的 cluster 是否正常运行：</p>
<pre class="codehilite"><code class="language-bash">opensrc-1 $ rabbitmqctl cluster_status
Cluster status of node rabbit@opensrc-1 ...
[{nodes,[{disc,['rabbit@opensrc-1']}]},
 {running_nodes,['rabbit@opensrc-1']},
 {cluster_name,&lt;&lt;&quot;rabbit@opensrc-1&quot;&gt;&gt;},
 {partitions,[]},
 {alarms,[{'rabbit@opensrc-1',[]}]}]</code></pre>


<p>确认每个节点的状态都正常后。我们可以开始组建多节点集群。首先要停掉应用，然后通过命令行加入集群，最后启动应用。 譬如，下面以第二台加入到第一台的集群为例：</p>
<pre class="codehilite"><code class="language-bash">opensrc-2 $ rabbitmqctl stop_app
Stopping rabbit application on node rabbit@opensrc-2 ...

opensrc-2 $ rabbitmqctl reset
Resetting node rabbit@opensrc-2 ...

opensrc-2 $ rabbitmqctl join_cluster rabbit@opensrc-1
Clustering node rabbit@opensrc-2 with rabbit@opensrc-1

opensrc-2 $ rabbitmqctl start_app
Starting node rabbit@opensrc-2 ...
 completed with 0 plugins.</code></pre>


<p>注意到这里使用了 reset 来确保它加入新集群之前，删除之前集群相关的数据和信息。 对 opensrc-3 做同样的操作后。我们运行 <code>cluster_status</code> 命令可以看到，三台访问的结果一样了，它们位于同一个集群了。</p>
<pre class="codehilite"><code class="language-bash">opensrc-2 $ rabbitmqctl cluster_status
Cluster status of node rabbit@opensrc-2 ...
[{nodes,[{disc,['rabbit@opensrc-1','rabbit@opensrc-2','rabbit@opensrc-3']}]},
 {running_nodes,['rabbit@opensrc-3','rabbit@opensrc-1','rabbit@opensrc-2']},
 {cluster_name,&lt;&lt;&quot;rabbit@opensrc-1&quot;&gt;&gt;},
 {partitions,[]},
 {alarms,[{'rabbit@opensrc-3',[]},
          {'rabbit@opensrc-1',[]},
          {'rabbit@opensrc-2',[]}]}]</code></pre>


<p>让一台脱离集群，有两种方法。</p>
<p>我们将 opensrc-3 移除集群为例，第一种方法是当 opensrc-3 节点还处于正常状态可访问时：</p>
<pre class="codehilite"><code class="language-bash">opensrc-3 $ rabbitmqctl stop_app
Stopping rabbit application on node rabbit@opensrc-3 ...

opensrc-3 $ rabbitmqctl reset
Resetting node rabbit@opensrc-3 ...

opensrc-3 $ rabbitmqctl start_app
Starting node rabbit@opensrc-3 ...

opensrc-3 $ rabbitmqctl cluster_status
Cluster status of node rabbit@opensrc-3 ...
[{nodes,[{disc,['rabbit@opensrc-3']}]},
 {running_nodes,['rabbit@opensrc-3']},
 {cluster_name,&lt;&lt;&quot;rabbit@opensrc-3&quot;&gt;&gt;},
 {partitions,[]},
 {alarms,[{'rabbit@opensrc-3',[]}]}]</code></pre>


<p>第二种方法是，从集群中另外一台正常节点上剔除 opensrc-3,假设我们停掉 opensrc-3 上的 rabbitmq 服务，然后登录 opensrc-1 来操作：</p>
<pre class="codehilite"><code class="language-bash">opensrc-1 $ rabbitmqctl cluster_status
Cluster status of node rabbit@opensrc-1 ...
[{nodes,[{disc,['rabbit@opensrc-1','rabbit@opensrc-2','rabbit@opensrc-3']}]},
 {running_nodes,['rabbit@opensrc-2','rabbit@opensrc-1']},
 {cluster_name,&lt;&lt;&quot;rabbit@opensrc-1&quot;&gt;&gt;},
 {partitions,[]},
 {alarms,[{'rabbit@opensrc-2',[]},{'rabbit@opensrc-1',[]}]}]

opensrc-1 $ rabbitmqctl forget_cluster_node rabbit@opensrc-3
Removing node rabbit@opensrc-3 from the cluster

opensrc-1 $ rabbitmqctl cluster_status
Cluster status of node rabbit@opensrc-1 ...
[{nodes,[{disc,['rabbit@opensrc-1','rabbit@opensrc-2']}]},
 {running_nodes,['rabbit@opensrc-2','rabbit@opensrc-1']},
 {cluster_name,&lt;&lt;&quot;rabbit@opensrc-1&quot;&gt;&gt;},
 {partitions,[]},
 {alarms,[{'rabbit@opensrc-2',[]},{'rabbit@opensrc-1',[]}]}]</code></pre>


<p>这时 opensrc-1 和 opensrc-2 组成集群，opensrc-3 此时还认为自己属于之前的集群，这时启动它，会以下错误：</p>
<pre class="codehilite"><code class="language-txt">throw:{error,{inconsistent_cluster,&quot;Node 'rabbit@opensrc-3' thinks it's clustered with node 'rabbit@opensrc-2', but 'rabbit@opensrc-2' disagrees&quot;}}</code></pre>


<p>解决它启动的问题需要 reset 节点信息：</p>
<pre class="codehilite"><code class="language-bash">opensrc-3 $ rabbitmqctl reset
Resetting node rabbit@opensrc-3 ...

opensrc-3 $ rabbitmqctl start_app
Starting node rabbit@opensrc-3 ...</code></pre>


<p>如果一个节点 reset 后，重新加入之前的集群，它会同步所有的 virtual hosts,用户，权限以及拓扑（队列，exchangs，bindings），运行参数和策略。如果有配置镜像队列策略命中它，它也会同步镜像队列的内容。没有配置镜像策略的队列，在该节点的数据则会丢失。</p>
<h2 id="_10">高可用（镜像）队列</h2>
<p>什么是镜像队列？默认配置下，RabbitMQ 中一个队列的内容，只存在单一节点上。这和 exchanges 以及 bindings 不同，它们在集群中所有节点上会复制同步。 不过队列的内容可以通过配置策略来实现多节点同步。</p>
<pre class="codehilite"><code class="language-bash">rabbitmqctl set_policy ha-all &quot;^&quot; \
   '{&quot;ha-mode&quot;:&quot;all&quot;,&quot;ha-sync-mode&quot;:&quot;automatic&quot;}'</code></pre>


<p>对所有队列（正则表达匹配所有），设置 ha-mode 为 all，表示所有 node 节点都镜像队列，ha-sync-mode 为自动同步。</p>
<h2 id="_11">管理插件</h2>
<p>RabbitMQ 的"management plugin"提供了基于 HTTP API 对 RabbitMQ 的节点和集群进行管理和监控的工具。它包括一个浏览器访问的 WebUI 页面，和一个命令行工具 rabbitmqadmin。</p>
<p>首先我们开启 web 管理插件：</p>
<pre class="codehilite"><code class="language-bash">rabbitmq-plugins enable rabbitmq_management</code></pre>


<p>开启后不需要重启 rabbitmq，会直接激活生效。这时查看本机 rabbitmq 监听了 15672 的 http 端口。</p>
<p>注意这个命令，只对当前运行的 node 生效，但是通过这个启用 web 插件的节点，可以管理操作整个集群的所有节点。</p>
<p>除了用 <code>rabbitmq-plugins</code> 命令开启，也可以用配置文件的方式：</p>
<pre class="codehilite"><code class="language-bash">echo '[rabbitmq_management,rabbitmq_management_agent].' &gt; /etc/rabbitmq/enabled_plugins</code></pre>


<h2 id="_12">启动脚本</h2>
<ul>
<li>systemd 定义：/usr/lib/systemd/system/rabbitmq-server.service</li>
<li>/usr/lib/rabbitmq/bin/rabbitmq-server</li>
<li>
<p>source /usr/lib/rabbitmq/bin/rabbitmq-env</p>
<ul>
<li>set NODENAME RABBITMQ_HOME</li>
<li>source /usr/lib/rabbitmq/bin/rabbitmq-defaults</li>
<li>source $CONF_ENV_FILE(如果存在)</li>
</ul>
</li>
<li>
<p>这么多层 source 最后合并的环境变量是怎么样的，可以通过 <code>rabbitmqctl environment</code> 命令来打印</p>
</li>
</ul>
<h2 id="_13">端口用途</h2>
<ul>
<li>4379: epmd 服务发现的端口，rabbitmq 节点之间和命令行工具会访问。</li>
<li>5672: AMQP 0-9-1 and 1.0 的客户端会访问到。</li>
<li>25672: 节点之间内部通信用。它是 20000+上面的 AMQP 端口(5672)生成的。</li>
<li>15672: 开启管理插件后启用，使用 HTTP API 客户端以及 rabbitmqadmin 命令行工具会访问这个端口。</li>
</ul>
<h2 id="_14">启动成功检验标准</h2>
<ul>
<li><code>netstat -tnlpu | grep 5672</code> 能看到三个端口 5672、15672、25672，则表示监听和启动正常</li>
<li><code>curl -i -u $BK_RABBITMQ_ADMIN_USER:$BK_RABBITMQ_ADMIN_PASSWORD http://&lt;rabbitmq IP&gt;:15672/api/vhosts</code> 看返回是否正常</li>
</ul>
<h2 id="_15">权限管理</h2>
<p>rabbitmq 默认启动时，会创建一个"/"的 vhost，以及默认的"guest"账号，密码为"guest"，仅可以通过本地网卡访问。</p>
<p>蓝鲸初始化时，会删除 guest 账号，并通过 <code>./bin/01-generate/dbadmin.env</code> 里定义的 $BK_RABBITMQ_ADMIN_USER 和 $BK_RABBITMQ_ADMIN_PASSWORD 创建一个 administrator 角色的账号</p>
<p>administrator 拥有最高权限，这个账号密码在注册 rabbitmq 给 paas 平台时，传递给 paas 的接口。</p>
<pre class="codehilite"><code class="language-bash">rabbitmqctl add_user &quot;$BK_RABBITMQ_ADMIN_USER&quot; &quot;$BK_RABBITMQ_ADMIN_PASSWORD&quot;
rabbitmqctl set_user_tags &quot;$BK_RABBITMQ_ADMIN_USER&quot; administrator</code></pre>


<p>然后为后台模块创建对应的 vhost 和用户，并分配 management 的 tag</p>
<pre class="codehilite"><code class="language-bash">rabbitmqctl add_user &quot;$app_code&quot; &quot;$app_token&quot;
rabbitmqctl set_user_tags $app_code management
rabbitmqctl add_vhost $app_code
# 表示给$app_code用户授予$app_code这个vhost的所有资源的读写和配置权限
rabbitmqctl set_permissions -p $app_code $app_code &quot;.*&quot; &quot;.*&quot; &quot;.*&quot;</code></pre>


<h2 id="webui">WebUI</h2>
<p>如果网络策略允许，可以直接用浏览器访问 rabbitmq 所在机器的 15672 端口。
如果网络策略只允许 nginx 访问，我们可以用以下配置做代理转发：</p>
<pre class="codehilite"><code class="language-nginx">server {
    listen 80;
    server_name rabbitmq.bktencent.com;

    location / {
        proxy_pass http://10.0.0.1:15672;
    }
}</code></pre>


<p>然后配置 rabbitmq.bktencent.com 的 hosts 文件解析到 Nginx 的 IP，直接访问 80 端口即可。</p>
<p>打开后，需要输入用户名和密码。你可以选择输入管理员的，也就是上一节中，添加的为 administrator 角色的 $BK_RABBITMQ_ADMIN_USER 和 $BK_RABBITMQ_ADMIN_PASSWORD</p>
<p>也可以使用需要观察的 vhost 对应的用户名和密码，比如对于作业平台就是 bk_job 和对应的密码。</p>
<h2 id="_16">管理</h2>
<p>rabbitmqadmin 这个脚本通过 http api 和集群交互，可以做一些日常管理操作：</p>
<ul>
<li>
<p>下载 rabbitmqadmin:</p>
<p><code>bash
wget -O /usr/local/bin/rabbitmqadmin http://server-name:15672/cli/rabbitmqadmin
chmod +x /usr/local/bin/rabbitmqadmin</code></p>
</li>
</ul>
<h2 id="_17">网络故障后恢复集群</h2>
<p>假设有两台 rabbitmq 组成的集群，设为 rbtnode1 和 rbtnode2。因为某些原因 rbtnode1 和 rbtnode2 之间丢包率超过 50%导致集群状态异常。</p>
<p>这时，先确认两台是否已经脱离集群模式，分别在两台机器上运行 <code>rabbitmqctl cluster_status</code> 会发现各自的 running nodes 都只是自身。</p>
<p>这时，选择一台作为 master，另外一台则为 slave。譬如我们选 rbtnode1 为 master，那么现在登陆到 rbtnode2，运行以下命令：</p>
<pre class="codehilite"><code class="language-bash"># 停app
rabbitmqctl stop_app
# 重置
rabbitmqctl reset
# 加入集群
rabbitmqctl join_cluster rabbit@rbtnode1
# 启动app
rabbitmqctl start_app</code></pre>


<p>如果在 join_cluster 时，报错 "inconsistent_cluster, 'Node rabbitq@rbtnode1 thinks it\s' cluster with node rabbit@rbtnode2, but rabbit@rbtnode2 disagrees'"</p>
<p>这时在 rbtnode1 上，执行以下命令：</p>
<pre class="codehilite"><code class="language-bash"># 忘掉rbtnode节点
rabbitmqctl forget_cluster_node rabbit@rbtnode2</code></pre>


<p>再到 rbtnode2 上，重新执行 join_cluster 和 start_app 即可。</p>
<p>详细说明参考官方文档：https://www.rabbitmq.com/partitions.html</p>
<p>然后两台机器都看一下，集群状态正常 <code>rabbitmqctl cluster_status</code></p>
<h2 id="_18">常用命令</h2>
<ul>
<li>查看当前的所有 vhosts 中，messages 最多的：<code>rabbitmqctl list_vhosts -q  | xargs -I vhost -P0 -n1 sh -c 'rabbitmqctl list_queues -q -p vhost| awk -v vh=vhost "{print vh,\$0}"' | sort -n -k3</code></li>
</ul><h1 id="603-patch">社区版 6.0.3 Patch 升级指引</h1>
<h2 id="_1">适用范围</h2>
<p>6.0.2 - 6.0.3</p>
<h2 id="_2">说明</h2>
<ul>
<li>如无特殊说明，所述操作均在中控机执行。</li>
<li>文中所述的目录路径均以默认为主，如与实际有出入，请以升级实际路径为准。</li>
<li>本次升级会停止部分服务，请避开业务高峰期进行升级，以免影响业务正常运行。</li>
<li>本次升级仅面向涉及到的产品，未更新的产品不做阐述，请知悉。详细请见官网文档：<a href="https://bk.tencent.com/docs/document/6.0/127/7774">组件更新</a>。</li>
</ul>
<h2 id="_3">获取更新产品信息</h2>
<p>本次社区版 6.0.3 更新涉及产品：PaaS 平台、节点管理、作业平台、监控平台、日志平台、流程服务、故障自愈、权限中心、配置平台、标准运维、管控平台以及用户管理。如需了解本次更新详情，请查看 <a href="https://bk.tencent.com/docs/document/6.0/156/6976">版本日志</a>。</p>
<p>获取当前环境下版本：</p>
<pre class="codehilite"><code class="language-bash"># 获取版本
cd /data/src; grep . VERSION

# 蓝鲸各产品版本
cd /data/src; grep . */*VERSION */*/VERSION</code></pre>


<h2 id="_4">前置准备</h2>
<p>1.下载相关产品包。请前往 <a href="https://bk.tencent.com/download_version_list/">蓝鲸官网下载页-版本列表</a> 下载。</p>
<ul>
<li>patch 包：bkce_patch_6.0.2-6.0.3.tgz</li>
</ul>
<p>2.将相关产品包上传至服务器 /data 目录。</p>
<p>3.备份 install、src 目录</p>
<pre class="codehilite"><code class="language-bash">cp -a -r /data/install /data/install_$(date +%Y%m%d%H%M)
mv /data/src /data/src.bak</code></pre>


<p>4.准备新版本部署脚本以及产品包</p>
<pre class="codehilite"><code class="language-bash"># 创建新版本产品临时存放目录
mkdir /data/tmp

# 将 patch 包解压至临时存放目录
tar xf bkce_patch_6.0.2-6.0.3.tgz -C /data/tmp

# 解压 install 部署脚本包
tar xf /data/tmp/install_ce-v3.0.8.tgz -C /data/tmp/</code></pre>


<p>5.替换 install、src。</p>
<ul>
<li>
<p>替换 src 目录</p>
<p><code>bash
mv /data/tmp/src /data/</code></p>
</li>
<li>
<p>替换 install</p>
<p>```bash</p>
<h1 id="_5">替换部署脚本</h1>
<p>rsync -avz --delete --exclude=".<em>" --exclude="install.config" --exclude="bin/0[1234]-</em>" /data/tmp/install/ /data/install/</p>
<h1 id="src">解压 src 下各个产品软件包</h1>
<p>cd /data/src/; for f in *gz;do tar xf $f; done</p>
<h1 id="_6">还原证书</h1>
<p>cp -a /data/src.bak/cert /data/src/</p>
<h1 id="backup">还原 backup 目录</h1>
<p>cp -a /data/src.bak/backup /data/src/</p>
<h1 id="pythonyumlicense">还原 python、yum、license 等</h1>
<p>cp -a -r /data/src.bak/{bkssm,python,yum,license,blueking.env,COMMON_VERSION,VERSION,java8.tgz,paas_agent} /data/src</p>
<p>cp -a -r /data/src.bak/gse_plugins/gsecmdline-2.0.3.tgz /data/src/gse_plugins/
echo "6.0.3" &gt; /data/src/VERSION
```</p>
</li>
</ul>
<h2 id="_7">特殊操作</h2>
<p><strong>重要：</strong> 因配置平台、作业平台、日志平台新增了进程以及对应的后台变量，所以需要在升级前做特殊操作。 <code>6.0.3 之前版本均需要操作</code></p>
<h3 id="_8">配置平台</h3>
<pre class="codehilite"><code class="language-bash">echo &quot;BK_CMDB_EVENTS_MONGODB_PASSWORD=$(&lt;/dev/urandom tr -dc _A-Za-z0-9&quot;$2&quot; | head -c&quot;${1:-12}&quot;)&quot; &gt;&gt; /data/install/bin/03-userdef/cmdb.env</code></pre>


<h3 id="_9">作业平台</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

cat &gt;&gt; /data/install/bin/03-userdef/job.env  &lt;&lt; EOF
BK_JOB_ANALYSIS_MYSQL_PASSWORD=${BK_JOB_BACKUP_MYSQL_PASSWORD}
BK_JOB_ANALYSIS_RABBITMQ_PASSWORD=${BK_JOB_BACKUP_RABBITMQ_PASSWORD}
BK_JOB_ANALYSIS_REDIS_SENTINEL_PASSWORD=${BK_JOB_BACKUP_REDIS_SENTINEL_PASSWORD}
BK_JOB_ANALYSIS_REDIS_PASSWORD=${BK_JOB_BACKUP_REDIS_PASSWORD}
EOF</code></pre>


<h3 id="_10">日志平台</h3>
<ul>
<li>install.config 文件新增 log(grafana) 模块
可参考 install.config.3ip.sample 文件中 log(grafana) 的分布。</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 默认与 log(api)同一台机器，添加时请确保该主机上的资源富余
sed -i 's/log(api)/&amp;,log(grafana)/' /data/install/install.config</code></pre>


<pre class="codehilite"><code class="language-bash">echo &quot;BK_BKLOG_MYSQL_PASSWORD=$(&lt;/dev/urandom tr -dc _A-Za-z0-9&quot;$2&quot; | head -c&quot;${1:-12}&quot;)&quot; &gt;&gt; /data/install/bin/03-userdef/bklog.env

# 授权 bklog 的 login-path
source /data/install/utils.fc
/data/install/bin/setup_mysql_loginpath.sh -n mysql-log -h $BK_MYSQL_IP -u root -p $BK_MYSQL_ADMIN_PASSWORD

# 授权 MySQL bklog 用户
./bkcli initdata mysql</code></pre>


<h3 id="_11">重新渲染变量</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install bkenv
./bkcli sync common

# 新增 cmdb_events mongodb 用户
source /data/install/tools.sh
grant_mongodb_pri cmdb_events</code></pre>


<h2 id="_12">开始更新</h2>
<h3 id="paas">PaaS 平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade paas</code></pre>


<h3 id="_13">权限中心</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade bkiam
./bkcli install saas-o bk_iam</code></pre>


<h3 id="_14">用户管理</h3>
<p>如用户管理低于 2.2.4 版本，更新过程会有已知问题，详情请参考 <a href="https://bk.tencent.com/s-mart/community/question/1669">【缺陷修复】用户管理接入 AD/LDAP 无法正常同步用户</a></p>
<pre class="codehilite"><code class="language-bash"># 停止用户管理
source /data/install/utils.fc
./bkcli stop usermgr

# 删除用户管理虚拟环境
ssh $BK_USERMGR_IP 'rmvirtualenv usermgr-api'

# 开始更新
./bkcli install usermgr
./bkcli start usermgr
./bkcli install saas-o bk_user_manage</code></pre>


<h3 id="_15">配置平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli stop cmdb
./bkcli sync cmdb
# 开始升级
./bkcli install cmdb
./bkcli initdata cmdb
./bkcli restart cmdb
# 检查 cmdb 进程
./bkcli check cmdb</code></pre>


<h3 id="_16">作业平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli stop job
./bkcli sync job

# 开始升级
# 由于 job 新增了一个进程，请在升级前，确认 job 所在机器上的内存是否足够。否则将会影响进程启动。

./bkcli install job

# 检查 cmdb 进程
./bkcli check job</code></pre>


<h3 id="_17">管控平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade gse</code></pre>


<h3 id="_18">节点管理</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_nodeman
./bkcli stop bknodeman
ssh $BK_NODEMAN_IP 'rmvirtualenv bknodeman-nodeman'

./bkcli sync bknodeman
./bkcli install bknodeman
./bkcli start bknodeman

# 更新采集器相关插件
./bkcli initdata nodeman</code></pre>


<h3 id="_19">监控平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_monitorv3
./bkcli stop bkmonitorv3
 ssh $BK_MONITORV3_IP 'rmvirtualenv bkmonitorv3-monitor'

./bkcli sync bkmonitorv3
./bkcli install bkmonitorv3
./bkcli start bkmonitorv3
./bkcli status bkmonitorv3</code></pre>


<p>如在升级过程中，如果出现了如下报错，请按照该方式解决：</p>
<pre class="codehilite"><code class="language-bash">./pcmd.sh -m monitorv3 &quot;rmvirtualenv bkmonitorv3-monitor&quot;
./pcmd.sh -m monitorv3 &quot;rm -rf /root/.local/share/virtualenv/&quot;</code></pre>


<p><img alt="update of the 6.0 patch" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/6.0.2patch.png" /></p>
<h3 id="_20">日志平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_log_search
./bkcli stop bklog
ssh $BK_LOG_IP 'rmvirtualenv bklog-api'

./bkcli sync bklog
./bkcli install bklog
./bkcli start bklog
./bkcli status bklog</code></pre>


<h3 id="_21">故障自愈</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_fta_solutions
./bkcli upgrade fta</code></pre>


<h3 id="_22">标准运维</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_sops</code></pre>


<h3 id="_23">流程服务</h3>
<pre class="codehilite"><code class="language-bash"># 加载 itsm 新增的环境变量
source tools.sh
add_saas_environment

./bk_install saas-o bk_itsm</code></pre>


<h3 id="_24">更新蓝鲸业务拓扑</h3>
<ul>
<li>
<p>JOB 新增 <code>analysis</code>， 在执行完 JOB 模块升级后执行</p>
</li>
<li>
<p>cmdb 对于服务模板,<code>监听信息</code> 相关的 <code>IP</code> 字段数据变更，agent 的 processbeat 插件版本更新到 <code>1.15.61</code> 版本及以上</p>
<ul>
<li>方案一： 删掉现有的蓝鲸业务下所有的模块和模板数据，重新注册. 脚本操作，所以会删掉用户已经在蓝鲸业务中自定义添加的相关数据
```bash</li>
</ul>
<h1 id="step1">step1: 开启页面删除蓝鲸集群选项</h1>
<p>source /data/install/utils.fc
curl -H 'BK_USER:admin' -H 'BK_SUPPLIER_ID:0' -H 'HTTP_BLUEKING_SUPPLIER_ID:0' -X POST $BK_CMDB_IP0:9000/migrate/v3/migrate/system/user_config/blueking_modify/true</p>
<h1 id="step2">step2: 转移蓝鲸业务后台业务拓扑相关服务器到主机资源池(删掉转移过程中的进程实例)</h1>
<h1 id="step3-">step3: 通过页面 业务拓扑 -&gt; 集群 -&gt; 节点信息 ，删掉现有的所有蓝鲸集群</h1>
<h1 id="step4">step4: 删掉所有的蓝鲸集群模板与进程模板</h1>
<p>cd /data/install &amp;&amp; source utils.fc &amp;&amp; /opt/py36/bin/python ${CTRL_DIR}/bin/create_blueking_set.py -c ${BK_PAAS_APP_CODE}  -t ${BK_PAAS_APP_SECRET} --delete</p>
<h1 id="step5">step5: 删除原拓扑标记文件中对于日志平台的标记</h1>
<p>pcmd -m log "sed -i '/log/d' /data/bkce/.installed_module"</p>
<h1 id="step5_1">step5: 重新注册蓝鲸业务拓扑</h1>
<p>cd /data/install &amp;&amp; ./bkcli initdata topo
```</p>
<ul>
<li>方案二： 用户通过页面手动更改所有监控信息异常的进程模板，并同步到现有进程实例，完成<code>IP</code>字段的变更</li>
</ul>
<p><strong>需将之前<code>ip</code>为空的字段，变更<code>第一内网IP</code>或者是<code>0.0.0.0</code>，具体情况根据进程实际监听地址修改</strong></p>
</li>
</ul>
<h3 id="_25">刷新版本信息</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/tools.sh
_update_common_info</code></pre>


<h2 id="_26">升级后操作</h2>
<ul>
<li>
<p>升级完成后，请前往节点管理页面升级/重装 agent、Proxy 以及采集器相关插件。</p>
</li>
<li>
<p>如果之前有部署 bkci 以及 bcs 的用户，请按照该方式将相关包进行还原 (<code>没有部署请忽略该步骤</code>)</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash"># bkci
mv /data/src.bak/ci/ /data/src/

# bcs
mv /data/src.bak/public-images-community.tar.gz /data/src/
mv /data/src.bak/bcs_cc-ce-1.0.28.tar.gz /data/src/
mv /data/src.bak/python.tar.gz /data/src/
mv /data/src.bak/docker-18.09.5.tgz /data/src/
mv /data/src.bak/etcd-v3.3.12-linux-amd64.tar.gz /data/src/
mv /data/src.bak/mongodb-linux-x86_64-2.4.10.tgz /data/src/
mv /data/src.bak/jdk8.tar.gz /data/src/
mv /data/src.bak/bk_bcs_app_V1.3.21.tar.gz /data/src/
mv /data/src.bak/bcs-prom-k8s-ce-1.1.1.tar.gz /data/src/
mv /data/src.bak/harbor_api_ce-1.1.1.tgz /data/src/
mv /data/src.bak/docker-compose /data/src/
mv /data/src.bak/kubeops-ce_v1.tar.gz /data/src/
mv /data/src.bak/cryptools /data/src/
mv /data/src.bak/etcd-v3.4.13-linux-amd64.tar.gz /data/src/
mv /data/src.bak/harbor_charts-1.0.6.tar.gz /data/src/
mv /data/src.bak/bcs-service.ce.1.18.10-20.11.05.2011052349.tar.gz /data/src/
mv /data/src.bak/harbor_server-v1.7.6.tar.gz /data/src/
mv /data/src.bak/bk_bcs_monitor_V1.5.4.tar.gz /data/src/
mv /data/src.bak/devops-ce-1.0.29.11.tgz /data/src/
mv /data/src.bak/bcs_web_console-ce-V1.3.21.tar.gz /data/src/
mv /data/src.bak/java8.tgz /data/src/
mv /data/src.bak/bcs-monitor-ce-1.2.12-1.el7.x86_64.rpm /data/src/
mv /data/src.bak/bcs-thanos-ce-1.2.12-1.el7.x86_64.rpm /data/src/</code></pre>


<p>如升级过程有任何疑问及问题，请前往蓝鲸社区群 (495299374) 联系蓝鲸助手获取技术支持。</p><h1 id="604">社区版 6.0.4 升级指引</h1>
<h2 id="_1">适用范围</h2>
<p>6.0.3 - 6.0.4</p>
<h2 id="_2">说明</h2>
<ul>
<li>如无特殊说明，所述操作均在中控机执行。</li>
<li>文中所述的目录路径均以默认为主，如与实际有出入，请以升级实际路径为准。</li>
<li>本次升级仅面向涉及到的产品，未更新的产品不做阐述，请知悉。详细请见官网文档：<a href="https://bk.tencent.com/docs/document/6.0/127/7774">组件更新</a>。</li>
</ul>
<h2 id="_3">获取更新产品信息</h2>
<p>本次社区版 6.0.4 更新涉及产品：PaaS 平台、节点管理、监控平台、日志平台、流程服务、故障自愈、权限中心、配置平台、标准运维、管控平台以及用户管理。如需了解本次更新详情，请查看 <a href="https://bk.tencent.com/docs/document/6.0/156/9867">版本日志</a>。</p>
<p>获取当前环境下版本：</p>
<pre class="codehilite"><code class="language-bash"># 获取版本
cd /data/src; grep . VERSION

# 蓝鲸各产品版本
cd /data/src; grep . */*VERSION */*/VERSION</code></pre>


<h2 id="_4">前置准备</h2>
<p>1.下载相关产品包。请前往 <a href="https://bk.tencent.com/download_version_list/">蓝鲸官网下载页-版本列表</a> 下载。</p>
<ul>
<li>patch 包：<a href="https://bkopen-1252002024.file.myqcloud.com/ce/bkce_patch_6.0.3-6.0.4.tgz">bkce_patch_6.0.3-6.0.4.tgz</a></li>
</ul>
<p>2.将相关产品包上传至服务器 /data 目录。</p>
<p>3.备份 install、src 目录</p>
<pre class="codehilite"><code class="language-bash">cp -a -r /data/install /data/install_6.0.3_$(date +%Y%m%d%H%M)
mv /data/src /data/src_6.0.3.bak</code></pre>


<p>4.准备新版本部署脚本以及产品包</p>
<pre class="codehilite"><code class="language-bash"># 创建新版本产品临时存放目录
mkdir /data/tmp

# 将 patch 包解压至临时存放目录
tar xf /data/bkce_patch_6.0.3-6.0.4.tgz -C /data/tmp

# 解压 install 部署脚本包
tar xf /data/tmp/install_ce-v3.0.10.tgz -C /data/tmp/</code></pre>


<p>5.替换 install、src。</p>
<ul>
<li>
<p>替换 src 目录</p>
<p><code>bash
mv /data/tmp/src /data/</code></p>
</li>
<li>
<p>替换 install</p>
<p>```bash</p>
<h1 id="_5">替换部署脚本</h1>
<p>rsync -avz --delete --exclude=".<em>" --exclude="install.config" --exclude="bin/0[1234]-</em>" /data/tmp/install/ /data/install/</p>
<h1 id="src">解压 src 下各个产品软件包</h1>
<p>cd /data/src/; for f in *gz;do tar xf $f; done</p>
<h1 id="_6">还原不需要更新的模块</h1>
<p>cp -a -r /data/src_6.0.3.bak/{bkssm,python,yum,license,blueking.env,java8.tgz,backup,cert,job} /data/src
cp -a -r /data/src_6.0.3.bak/official_saas/bk_fta_solutions_V5.2.14-ce-bkofficial.tar.gz /data/src/official_saas/
cp -a -r /data/src_6.0.3.bak/gse_plugins/{gsecmdline-2.0.3.tgz,pluginscripts-1.0.3.tgz} /data/src/gse_plugins/
```</p>
</li>
</ul>
<h2 id="_7">开始更新</h2>
<p>开始更新前请先同步最新脚本至其他机器。</p>
<pre class="codehilite"><code class="language-bash">./bkcli sync common</code></pre>


<h3 id="paas">PaaS 平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade paas</code></pre>


<h3 id="paasagent">更新 paasagent</h3>
<ul>
<li>更新 appo 以及 appt 环境</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade appo
./bkcli upgrade appt</code></pre>


<h3 id="docker">更新 docker 镜像</h3>
<ul>
<li>更新 appo 机器上的 python 镜像</li>
</ul>
<pre class="codehilite"><code class="language-bash">ssh $BK_APPO_IP
docker load &lt; /data/src/image/python27e_1.0.tar
docker load &lt; /data/src/image/python36e_1.0.tar
rsync -avz /data/src/image/runtool /usr/bin/
chmod +x  /usr/bin/runtool</code></pre>


<ul>
<li>更新 appt 机器上的 python 镜像</li>
</ul>
<pre class="codehilite"><code class="language-bash">ssh $BK_APPT_IP
docker load &lt; /data/src/image/python27e_1.0.tar
docker load &lt; /data/src/image/python36e_1.0.tar
rsync -avz /data/src/image/runtool /usr/bin/
chmod +x  /usr/bin/runtool</code></pre>


<h3 id="_8">权限中心</h3>
<h4 id="_9">特殊操作</h4>
<p><strong>重要：</strong> 因 6.0.3 升级至 6.0.4 权限中心 SaaS 需要先升级中间版本。所以下述操作必须操作。</p>
<ul>
<li>
<p>中间版本已随 patch 包放置 src/official_saas/ 目录下。</p>
</li>
<li>
<p>将 src/official_saas 目录下的 bk_iam_V1.3.6-bkofficial.tar.gz 包放置本地。</p>
</li>
<li>
<p>部署权限中心 SaaS 中间版本（bk_iam_V1.3.6-bkofficial.tar.gz）。</p>
</li>
<li>
<p>访问蓝鲸 PaaS 工作台 - 开发者中心 - S-mart 应用 - 找到 bk_iam，点击部署 - 上传版本 - 发布部署 - 选择 1.3.6 版本进行部署 - 部署至正式环境。</p>
</li>
<li>
<p>升级完中间版本后，全量同步所有的权限模板</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
ssh $BK_APPO_IP

docker exec -it $(docker ps | grep -w bk_iam | awk '{print $1}') bash 
export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;

# 脚本打印 Successful completion of template version synchronization 表示执行同步成功
/cache/.bk/env/bin/python /data/app/code/manage.py sync_templates</code></pre>


<ul>
<li>确认版本：<strong>后台必须为 1.6.1，SaaS 必须为：1.3.6</strong>。</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 后台版本
curl http://bkiam.service.consul:5001/version | jq .version</code></pre>


<p><strong>注意：</strong> 在此之前，必须将权限中心升级至指定中间版本，如未升级，请勿升级继续向下操作。</p>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_iam==1.4.24
./bkcli upgrade bkiam</code></pre>


<h3 id="_10">用户管理</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_user_manage
./bkcli upgrade usermgr</code></pre>


<h3 id="_11">配置平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade cmdb
# 检查 cmdb
./bkcli check cmdb</code></pre>


<h3 id="_12">管控平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade gse
./bkcli check gse</code></pre>


<h3 id="_13">节点管理</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_nodeman
./bkcli upgrade bknodeman

# 更新采集器相关插件
./bkcli initdata nodeman</code></pre>


<h3 id="_14">监控平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_monitorv3
./bkcli upgrade bkmonitorv3</code></pre>


<h3 id="_15">日志平台</h3>
<p>在 6.0.4 版本里，bklog 新增了 mysql 的依赖，所以在升级前，请确保 bklog 机器上是否有 mysql 的相关命令，否则升级过程中会有相关报错。</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
ssh $BK_LOG_IP &quot;yum -y install mysql-devel&quot;</code></pre>


<p>开始更新</p>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_log_search
./bkcli upgrade bklog

./bkcli restart bklog grafana</code></pre>


<h3 id="_16">故障自愈</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade fta</code></pre>


<h3 id="_17">标准运维</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_sops</code></pre>


<h3 id="_18">流程服务</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_itsm</code></pre>


<h3 id="saas">重装故障自愈 SaaS</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_fta_solutions</code></pre>


<h3 id="_19">删除旧镜像</h3>
<ul>
<li>因提供的命令是删除 appo 或者 appt 上所有的 none 镜像。执行前请确认所有的 none 镜像是否都可以删除。</li>
<li>如有自行的开发的 SaaS，需要自行重新部署后，才能进行删除。</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

# appo 环境
pcmd -m appo &quot;docker image prune  -f &quot;

# appt 环境
pcmd -m appt &quot;docker image prune  -f &quot;</code></pre>


<h3 id="_20">刷新版本信息</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/tools.sh
_update_common_info</code></pre>


<h2 id="_21">升级后操作</h2>
<ul>
<li>禁用 mysqld.service 服务，避免服务器重启后无法拉起蓝鲸使用的 mysql@default.service 服务</li>
</ul>
<pre class="codehilite"><code class="language-bash">cd /data/install
./pcmd.sh -m mysql &quot;systemctl disable mysqld.service&quot;</code></pre>


<ul>
<li>请前往配置平台修改蓝鲸业务下的 gse_btsvr 服务模版</li>
</ul>
<p>详细操作：配置平台 - 业务 (选择蓝鲸业务) - 服务模版 - 搜索 "gse_btsvr" - 点击 ID 进行编辑 - 将第一内网 IP 修改成 0.0.0.0 即可</p>
<p><img alt="change_gse_btsvr_bindip" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/assets/../产品白皮书/assets/change_gse_btsvr_bindip.png" /></p>
<ul>
<li>
<p>升级完成后，请前往节点管理页面升级/重装 agent、Proxy 以及相关采集器插件。</p>
</li>
<li>
<p>如果之前有部署 bkci 以及 bcs 的用户，请按照该方式将相关包进行还原 (<code>没有部署请忽略该步骤</code>)</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash"># bkci
mv /data/src_6.0.3.bak/ci/ /data/src/

# bcs
mv /data/src_6.0.3.bak/public-images-community.tar.gz /data/src/
mv /data/src_6.0.3.bak/bcs_cc-ce-1.0.28.tar.gz /data/src/
mv /data/src_6.0.3.bak/python.tar.gz /data/src/
mv /data/src_6.0.3.bak/docker-18.09.5.tgz /data/src/
mv /data/src_6.0.3.bak/etcd-v3.3.12-linux-amd64.tar.gz /data/src/
mv /data/src_6.0.3.bak/mongodb-linux-x86_64-2.4.10.tgz /data/src/
mv /data/src_6.0.3.bak/jdk8.tar.gz /data/src/
mv /data/src_6.0.3.bak/bk_bcs_app_V1.3.21.tar.gz /data/src/
mv /data/src_6.0.3.bak/bcs-prom-k8s-ce-1.1.1.tar.gz /data/src/
mv /data/src_6.0.3.bak/harbor_api_ce-1.1.1.tgz /data/src/
mv /data/src_6.0.3.bak/docker-compose /data/src/
mv /data/src_6.0.3.bak/kubeops-ce_v1.tar.gz /data/src/
mv /data/src_6.0.3.bak/cryptools /data/src/
mv /data/src_6.0.3.bak/etcd-v3.4.13-linux-amd64.tar.gz /data/src/
mv /data/src_6.0.3.bak/harbor_charts-1.0.6.tar.gz /data/src/
mv /data/src_6.0.3.bak/bcs-service.ce.1.18.10-20.11.05.2011052349.tar.gz /data/src/
mv /data/src_6.0.3.bak/harbor_server-v1.7.6.tar.gz /data/src/
mv /data/src_6.0.3.bak/bk_bcs_monitor_V1.5.4.tar.gz /data/src/
mv /data/src_6.0.3.bak/devops-ce-1.0.29.11.tgz /data/src/
mv /data/src_6.0.3.bak/bcs_web_console-ce-V1.3.21.tar.gz /data/src/
mv /data/src_6.0.3.bak/java8.tgz /data/src/
mv /data/src_6.0.3.bak/bcs-monitor-ce-1.2.12-1.el7.x86_64.rpm /data/src/
mv /data/src_6.0.3.bak/bcs-thanos-ce-1.2.12-1.el7.x86_64.rpm /data/src/</code></pre>


<p>如升级过程有任何疑问及问题，请前往蓝鲸社区群 (495299374) 联系蓝鲸助手获取技术支持。</p><h1 id="605">社区版 6.0.5 升级指引</h1>
<h2 id="_1">适用范围</h2>
<p>6.0.3 - 6.0.5</p>
<h2 id="_2">说明</h2>
<ul>
<li>如无特殊说明，所述操作均在中控机执行。</li>
<li>文中所述的目录路径均以默认为主，如与实际有出入，请以升级实际路径为准。</li>
<li>本次升级仅面向涉及到的产品，未更新的产品不做阐述，请知悉。详细请见官网文档：<a href="https://bk.tencent.com/docs/document/6.0/127/7774">组件更新</a>。</li>
</ul>
<h2 id="_3">获取更新产品信息</h2>
<p>本次社区版 6.0.5 更新涉及产品：PaaS 平台、节点管理、监控平台、日志平台、流程服务、故障自愈、权限中心、配置平台、标准运维、管控平台以及用户管理。如需了解本次更新详情，请查看 <a href="../../../版本日志/v6005.md">版本日志</a>。</p>
<p>获取当前环境下版本：</p>
<pre class="codehilite"><code class="language-bash"># 获取版本
cd /data/src; grep . VERSION

# 蓝鲸各产品版本
cd /data/src; grep . */*VERSION */*/VERSION</code></pre>


<h2 id="_4">前置准备</h2>
<p>1.下载相关产品包。请前往 <a href="https://bk.tencent.com/download_version_list/">蓝鲸官网下载页-版本列表</a> 下载。</p>
<ul>
<li>patch 包：<a href="https://bkopen-1252002024.file.myqcloud.com/ce/bkce_patch_6.0.3-6.0.4.tgz">bkce_patch_6.0.3-6.0.4.tgz</a><ul>
<li>此处复用 6.0.3-6.0.4 的升级包，6.0.4 - 6.0.5 仅修复 Apache Log4j2 存在潜在 JNDI 注入安全（CVE-2021-44228）漏洞，未有功能更新</li>
</ul>
</li>
</ul>
<p>2.将相关产品包上传至服务器 /data 目录。</p>
<p>3.备份 install、src 目录</p>
<pre class="codehilite"><code class="language-bash">cp -a -r /data/install /data/install_6.0.3_$(date +%Y%m%d%H%M)
mv /data/src /data/src_6.0.3.bak</code></pre>


<p>4.准备新版本部署脚本以及产品包</p>
<pre class="codehilite"><code class="language-bash"># 创建新版本产品临时存放目录
mkdir /data/tmp

# 将 patch 包解压至临时存放目录
tar xf /data/bkce_patch_6.0.3-6.0.4.tgz -C /data/tmp

# 解压 install 部署脚本包
tar xf /data/tmp/install_ce-v3.0.10.tgz -C /data/tmp/</code></pre>


<p>5.替换 install、src。</p>
<ul>
<li>
<p>替换 src 目录</p>
<p><code>bash
mv /data/tmp/src /data/</code></p>
</li>
<li>
<p>替换 install</p>
<p>```bash</p>
<h1 id="_5">替换部署脚本</h1>
<p>rsync -avz --delete --exclude=".<em>" --exclude="install.config" --exclude="bin/0[1234]-</em>" /data/tmp/install/ /data/install/</p>
<h1 id="src">解压 src 下各个产品软件包</h1>
<p>cd /data/src/; for f in *gz;do tar xf $f; done</p>
<h1 id="_6">还原不需要更新的模块</h1>
<p>cp -a -r /data/src_6.0.3.bak/{bkssm,python,yum,license,blueking.env,java8.tgz,backup,cert,job} /data/src
cp -a -r /data/src_6.0.3.bak/official_saas/bk_fta_solutions_V5.2.14-ce-bkofficial.tar.gz /data/src/official_saas/
cp -a -r /data/src_6.0.3.bak/gse_plugins/{gsecmdline-2.0.3.tgz,pluginscripts-1.0.3.tgz} /data/src/gse_plugins/
```</p>
</li>
</ul>
<h2 id="_7">开始更新</h2>
<p>开始更新前请先同步最新脚本至其他机器。</p>
<pre class="codehilite"><code class="language-bash">./bkcli sync common</code></pre>


<h3 id="paas">PaaS 平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade paas</code></pre>


<h3 id="paasagent">更新 paasagent</h3>
<ul>
<li>更新 appo 以及 appt 环境</li>
</ul>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade appo
./bkcli upgrade appt</code></pre>


<h3 id="docker">更新 docker 镜像</h3>
<ul>
<li>更新 appo 机器上的 python 镜像</li>
</ul>
<pre class="codehilite"><code class="language-bash">ssh $BK_APPO_IP
docker load &lt; /data/src/image/python27e_1.0.tar
docker load &lt; /data/src/image/python36e_1.0.tar
rsync -avz /data/src/image/runtool /usr/bin/
chmod +x  /usr/bin/runtool</code></pre>


<ul>
<li>更新 appt 机器上的 python 镜像</li>
</ul>
<pre class="codehilite"><code class="language-bash">ssh $BK_APPT_IP
docker load &lt; /data/src/image/python27e_1.0.tar
docker load &lt; /data/src/image/python36e_1.0.tar
rsync -avz /data/src/image/runtool /usr/bin/
chmod +x  /usr/bin/runtool</code></pre>


<h3 id="_8">权限中心</h3>
<h4 id="_9">特殊操作</h4>
<p><strong>重要：</strong> 因 6.0.3 升级至 6.0.4 权限中心 SaaS 需要先升级中间版本。所以下述操作必须操作。</p>
<ul>
<li>
<p>中间版本已随 patch 包放置 src/official_saas/ 目录下。</p>
</li>
<li>
<p>将 src/official_saas 目录下的 bk_iam_V1.3.6-bkofficial.tar.gz 包放置本地。</p>
</li>
<li>
<p>部署权限中心 SaaS 中间版本（bk_iam_V1.3.6-bkofficial.tar.gz）。</p>
</li>
<li>
<p>访问蓝鲸 PaaS 工作台 - 开发者中心 - S-mart 应用 - 找到 bk_iam，点击部署 - 上传版本 - 发布部署 - 选择 1.3.6 版本进行部署 - 部署至正式环境。</p>
</li>
<li>
<p>升级完中间版本后，全量同步所有的权限模板</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
ssh $BK_APPO_IP

docker exec -it $(docker ps | grep -w bk_iam | awk '{print $1}') bash 
export BK_FILE_PATH=&quot;/data/app/code/conf/saas_priv.txt&quot;

# 脚本打印 Successful completion of template version synchronization 表示执行同步成功
/cache/.bk/env/bin/python /data/app/code/manage.py sync_templates</code></pre>


<ul>
<li>确认版本：<strong>后台必须为 1.6.1，SaaS 必须为：1.3.6</strong>。</li>
</ul>
<pre class="codehilite"><code class="language-bash"># 后台版本
curl http://bkiam.service.consul:5001/version | jq .version</code></pre>


<p><strong>注意：</strong> 在此之前，必须将权限中心升级至指定中间版本，如未升级，请勿升级继续向下操作。</p>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_iam==1.4.24
./bkcli upgrade bkiam</code></pre>


<h3 id="_10">用户管理</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_user_manage
./bkcli upgrade usermgr</code></pre>


<h3 id="_11">配置平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade cmdb
# 检查 cmdb
./bkcli check cmdb</code></pre>


<h3 id="_12">管控平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade gse
./bkcli check gse</code></pre>


<h3 id="_13">节点管理</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_nodeman
./bkcli upgrade bknodeman

# 更新采集器相关插件
./bkcli initdata nodeman</code></pre>


<h3 id="_14">监控平台</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_monitorv3
./bkcli upgrade bkmonitorv3</code></pre>


<h3 id="_15">日志平台</h3>
<p>在 6.0.4 版本里，bklog 新增了 mysql 的依赖，所以在升级前，请确保 bklog 机器上是否有 mysql 的相关命令，否则升级过程中会有相关报错。</p>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc
ssh $BK_LOG_IP &quot;yum -y install mysql-devel&quot;</code></pre>


<p>开始更新</p>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_log_search
./bkcli upgrade bklog

./bkcli restart bklog grafana</code></pre>


<h3 id="_16">故障自愈</h3>
<pre class="codehilite"><code class="language-bash">./bkcli upgrade fta</code></pre>


<h3 id="_17">标准运维</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_sops</code></pre>


<h3 id="_18">流程服务</h3>
<pre class="codehilite"><code class="language-bash">./bk_install saas-o bk_itsm</code></pre>


<h3 id="saas">重装故障自愈 SaaS</h3>
<pre class="codehilite"><code class="language-bash">./bkcli install saas-o bk_fta_solutions</code></pre>


<h3 id="_19">删除旧镜像</h3>
<ul>
<li>因提供的命令是删除 appo 或者 appt 上所有的 none 镜像。执行前请确认所有的 none 镜像是否都可以删除。</li>
<li>如有自行的开发的 SaaS，需要自行重新部署后，才能进行删除。</li>
</ul>
<pre class="codehilite"><code class="language-bash">source /data/install/utils.fc

# appo 环境
pcmd -m appo &quot;docker image prune  -f &quot;

# appt 环境
pcmd -m appt &quot;docker image prune  -f &quot;</code></pre>


<h3 id="_20">刷新版本信息</h3>
<pre class="codehilite"><code class="language-bash">source /data/install/tools.sh
_update_common_info</code></pre>


<h2 id="apache-log4j2-jndi-cve-2021-44228">【重要】修复 Apache Log4j2 存在潜在 JNDI 注入安全（CVE-2021-44228）漏洞</h2>
<blockquote>
<p><a href="https://bk.tencent.com/s-mart/community/question/5120">漏洞说明</a></p>
</blockquote>
<pre class="codehilite"><code class="language-bash"># 中控机执行
cd /opt/yum
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.1-x86_64.rpm
createrepo ./

# 登录到每一台 es 机器执行
ssh $BK_ES7_IP
yum install -y elasticsearch-7.16.1

# 重启服务
systemctl restart elasticsearch.service
systemctl status elasticsearch.service</code></pre>


<h2 id="_21">升级后操作</h2>
<ul>
<li>禁用 mysqld.service 服务，避免服务器重启后无法拉起蓝鲸使用的 mysql@default.service 服务</li>
</ul>
<pre class="codehilite"><code class="language-bash">cd /data/install
./pcmd.sh -m mysql &quot;systemctl disable mysqld.service&quot;</code></pre>


<ul>
<li>请前往配置平台修改蓝鲸业务下的 gse_btsvr 服务模版</li>
</ul>
<p>详细操作：配置平台 - 业务 (选择蓝鲸业务) - 服务模版 - 搜索 "gse_btsvr" - 点击 ID 进行编辑 - 将第一内网 IP 修改成 0.0.0.0 即可</p>
<p><img alt="change_gse_btsvr_bindip" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/assets/../产品白皮书/assets/change_gse_btsvr_bindip.png" /></p>
<ul>
<li>
<p>升级完成后，请前往节点管理页面升级/重装 agent、Proxy 以及相关采集器插件。</p>
</li>
<li>
<p>如果之前有部署 bkci 以及 bcs 的用户，请按照该方式将相关包进行还原 (<code>没有部署请忽略该步骤</code>)</p>
</li>
</ul>
<pre class="codehilite"><code class="language-bash"># bkci
mv /data/src_6.0.3.bak/ci/ /data/src/

# bcs
mv /data/src_6.0.3.bak/public-images-community.tar.gz /data/src/
mv /data/src_6.0.3.bak/bcs_cc-ce-1.0.28.tar.gz /data/src/
mv /data/src_6.0.3.bak/python.tar.gz /data/src/
mv /data/src_6.0.3.bak/docker-18.09.5.tgz /data/src/
mv /data/src_6.0.3.bak/etcd-v3.3.12-linux-amd64.tar.gz /data/src/
mv /data/src_6.0.3.bak/mongodb-linux-x86_64-2.4.10.tgz /data/src/
mv /data/src_6.0.3.bak/jdk8.tar.gz /data/src/
mv /data/src_6.0.3.bak/bk_bcs_app_V1.3.21.tar.gz /data/src/
mv /data/src_6.0.3.bak/bcs-prom-k8s-ce-1.1.1.tar.gz /data/src/
mv /data/src_6.0.3.bak/harbor_api_ce-1.1.1.tgz /data/src/
mv /data/src_6.0.3.bak/docker-compose /data/src/
mv /data/src_6.0.3.bak/kubeops-ce_v1.tar.gz /data/src/
mv /data/src_6.0.3.bak/cryptools /data/src/
mv /data/src_6.0.3.bak/etcd-v3.4.13-linux-amd64.tar.gz /data/src/
mv /data/src_6.0.3.bak/harbor_charts-1.0.6.tar.gz /data/src/
mv /data/src_6.0.3.bak/bcs-service.ce.1.18.10-20.11.05.2011052349.tar.gz /data/src/
mv /data/src_6.0.3.bak/harbor_server-v1.7.6.tar.gz /data/src/
mv /data/src_6.0.3.bak/bk_bcs_monitor_V1.5.4.tar.gz /data/src/
mv /data/src_6.0.3.bak/devops-ce-1.0.29.11.tgz /data/src/
mv /data/src_6.0.3.bak/bcs_web_console-ce-V1.3.21.tar.gz /data/src/
mv /data/src_6.0.3.bak/java8.tgz /data/src/
mv /data/src_6.0.3.bak/bcs-monitor-ce-1.2.12-1.el7.x86_64.rpm /data/src/
mv /data/src_6.0.3.bak/bcs-thanos-ce-1.2.12-1.el7.x86_64.rpm /data/src/</code></pre>


<p>如升级过程有任何疑问及问题，请前往蓝鲸社区群 (495299374) 联系蓝鲸助手获取技术支持。</p><h1 id="_1">蓝鲸卸载指引</h1>
<p>为了防止误操作，卸载蓝鲸不支持批量，请自行批量操作，下面介绍一台机器卸载的方法：</p>
<p>建议先卸载其他节点的机器，最后卸载中控机节点。</p>
<ul>
<li>拷贝 uninstall.sh 到上一层</li>
</ul>
<pre class="codehilite"><code class="language-bash">cd /data/install
cp uninstall/uninstall.sh . </code></pre>


<ul>
<li>根据提示，确认后开始清理操作。</li>
</ul>
<pre class="codehilite"><code class="language-bash">bash uninstall.sh</code></pre><h2 id="_1">术语解释</h2>
<p>了解蓝鲸容器服务，会涉及到以下基本概念：</p>
<table><tbody>
<tr><td width="10%">容器编排引擎</td><td width="90%">用于容器化应用的自动化部署、扩展和管理的工具或平台，目前行业主流的引擎有 K8S 、Mesos。</td></tr>
<tr><td width="10%">集群</td><td width="90%">是指容器运行所需要的物理机或虚拟机资源的集合，可以选择集群-的模式是 Kubernetes（简称 K8S） 或者 Mesos。</td></tr>
<tr><td width="10%">节点</td><td width="90%">一台已经注册到集群中的服务器，为集群提供计算资源。</td></tr>
<tr><td width="10%">应用</td><td width="90%">由一组容器及服务构成集合，这个集合可以代表一个业务，或者业务的某个大区，在 K8S 中应用由 K8S 的工作负载（Workload）、服务（Service、Ingress）构成一个整体对外提供服务。</td></tr>
<tr><td width="10%">模板集</td><td width="90%">配置文件模板的集合，简化服务管理的复杂度，可以实现部署、升级应用。</td></tr>
<tr><td width="10%">网络</td><td width="90%">主要包含 服务 和 负载均衡器 的定义和管理，服务是由多个相同配置的容器和访问这些容器的规则组成的微服务，负载均衡器定义了访问规则的具体实现。</td></tr>
<tr><td width="10%">资源</td><td width="90%">资源中可以定义业务配置项，通过配置模板中关联这些业务配置项，可以实现对容器中业务进程使用配置的个性化管理。</td></tr>
<tr><td width="10%">仓库</td><td width="90%">用户存放 Docker 镜像、Helm Charts。</td></tr>
</tbody></table>

<h2 id="_2">帮助文档</h2>
<p><a href="https://bk.tencent.com/docs/document/6.0/144/6523">容器管理平台文档</a></p><h2 id="_1">服务管理方式</h2>
<p>容器管理平台使用 systemd 组件托管，具备以下特性与操作：</p>
<ol>
<li>服务器重启或进程异常 crash 后会自动拉起</li>
<li>服务启动命令：systemctl start <service_name></li>
<li>查看服务状态：systemctl status <service_name></li>
<li>查看服务配置：systemctl cat <service_name></li>
<li>服务停止命令：systemctl stop <service_name></li>
<li>服务重启命令：systemctl restart <service_name></li>
</ol>
<h2 id="_2">服务简介与部署路径</h2>
<h3 id="_3">存储组件</h3>
<ol>
<li>MYSQL</li>
<li>组件简介：为 bcs-api、bcs-cc、web_console、容器管理平台 SaaS、容器监控提供数据存储服务</li>
<li>服务名称：mysql@bcs</li>
<li>BIN 文件：/sbin/mysqld</li>
<li>配置文件：/etc/mysql/bcs.my.cnf</li>
<li>部署路径：rpm -ql mysql-community-server</li>
<li>日志路径：/data/bkce/logs/mysql/bcs.mysqld.log</li>
<li>Redis</li>
<li>组件简介：bcs-cc、web_console、容器管理平台 SaaS、容器监控提供数据缓存服务</li>
<li>服务名称：redis@bcs</li>
<li>部署路径：rpm -ql redis</li>
<li>BIN 文件：/usr/bin/redis-server</li>
<li>配置文件：service 参数</li>
<li>日志路径：/var/log/redis/bcs.log</li>
<li>MongoDB</li>
<li>组件简介：为 bcs-storage 提供数据存储服务</li>
<li>服务名称：mongod</li>
<li>部署路径：/usr/bin</li>
<li>BIN 文件：/usr/bin/mongod</li>
<li>配置文件：/etc/mongod.conf</li>
<li>日志路径：/data/bkce/logs/mongodb/mongod.log</li>
<li>Harbor</li>
<li>组件简介：Harbor 是 Vmware 公司开源的企业级 Docker Registry 管理项目，为 K8S 集群提供镜像仓库功能</li>
<li>服务名称：/data/bkce/harbor/server/start.sh、/data/bkce/harbor/server/stop.sh</li>
<li>部署路径：/data/bkce/harbor/server</li>
<li>BIN 文件：docker 容器</li>
<li>配置文件：docker 容器</li>
<li>日志路径：docker 容器</li>
<li>Etcd</li>
<li>组件简介：为 bcs-dns-service、K8S 集群提供数据存储服务</li>
<li>服务名称：etcd</li>
<li>部署路径：/usr/local/bin</li>
<li>BIN 文件：/usr/local/bin/etcd</li>
<li>配置文件：service 参数</li>
<li>日志路径：/var/log/messages</li>
<li>Zookpeer</li>
<li>组件简介：为 bcs-api、bcs-storage、bcs-cc 提供服务发现服务</li>
<li>服务名称：zookeeper</li>
<li>部署路径：rpm -ql zookeeper</li>
<li>BIN 文件：/usr/bin/java</li>
<li>配置文件：/etc/zookeeper/zoo.cfg</li>
<li>日志路径：/var/log/zookeeper/zookeeper.log</li>
</ol><h2 id="_1">容器管理平台组件</h2>
<ol>
<li>BCS API</li>
<li>组件简介：bcs-api 是容器管理平台对外提供服务的 API 接入层，负责将用户请求转发至对应的 kubernetes 集群中，兼容 kube-apiserver 的接口，同时打通了 kubernetes 的 rbac 体系</li>
<li>服务名称：bcs-api</li>
<li>部署路径：/data/bkce/bcs/bcs-api</li>
<li>BIN 文件：/data/bkce/bcs/bcs-api/bcs-api</li>
<li>配置文件：/data/bkce/etc/bcs/bcs-api.json</li>
<li>日志路径：/data/bkce/logs/bcs/bcs-api.[INFO|WARNING|ERROR]</li>
<li>BCS DNS Service</li>
<li>组件简介：bcs-dns-service 是容器管理平台系统中为集群提供域名解析服务的组件，同时支持集群内部和跨集群的 service 域名解析，并提供自定义域接口</li>
<li>服务名称：bcs-dns-service</li>
<li>部署路径：/data/bkce/bcs/bcs-dns-service</li>
<li>BIN 文件：/data/bkce/bcs/bcs-dns-service/bcs-dns-service</li>
<li>配置文件：/data/bkce/etc/bcs/bcs-dns-service.json</li>
<li>日志路径：/data/bkce/logs/bcs/bcs-dns-service.[INFO|WARNING|ERROR]</li>
<li>BCS Storage</li>
<li>组件简介：bcs-storage 是容器管理平台系统的动态数据管理组件，负责存储和汇聚容器管理平台系统中所有 kubernetes 集群上报的资源动态数据，对外提供统一的数据查询和事件订阅接口</li>
<li>服务名称：bcs-storage</li>
<li>部署路径：/data/bkce/bcs/bcs-storage</li>
<li>BIN 文件：/data/bkce/bcs/bcs-storage/bcs-storage</li>
<li>配置文件：/data/bkce/etc/bcs/bcs-storage.json</li>
<li>日志路径：/data/bkce/logs/bcs/bcs-storage.[INFO|WARNING|ERROR]</li>
<li>BCS OPS</li>
<li>组件简介：bcs-ops 为容器管理平台的创建集群、添加节点、删除节点、删除集群、导入集群等功能提供接口</li>
<li>服务名称：bcs-ops</li>
<li>BIN 文件：/data/bkce/bcs/bcs-ops/bcs-ops</li>
<li>配置文件：/data/bkce/etc/bcs/bcs-ops.json</li>
<li>部署路径：/data/bkce/bcs/bcs-ops</li>
<li>日志路径：/data/bkce/logs/bcs/bcs-ops.[INFO|WARNING|ERROR]</li>
<li>BCS CC</li>
<li>组件简介：容器管理平台配置中心是容器集群及节点等的配置中心，具备保存项目信息及绑定的蓝鲸 CMDB 业务信息、集群版本信息及集群快照信息、生成集群 ID，保存 master 及 node IP 信息及状态等功能</li>
<li>服务名称：bcs-cc</li>
<li>部署路径：/data/bkce/bcs/cc</li>
<li>BIN 文件：/data/bkce/bcs/cc/bin/bcs_cc</li>
<li>配置文件：/data/bkce/etc/bcs/cc.yml</li>
<li>日志路径：/var/log/messages</li>
<li>WebConsole</li>
<li>组件简介：提供 kubectl 命令行工具，可以快捷查看集群内资源</li>
<li>服务名称：bcs-web-console</li>
<li>部署路径：/data/bkce/bcs/web_console</li>
<li>BIN 文件：/data/bkce/.envs/bcs-web_console/bin/python</li>
<li>配置文件：参数-m backend.web_console</li>
<li>日志路径：/var/log/messages</li>
<li>BCS 导航页</li>
<li>组件简介：项目信息管理服务，负责项目创建及基本信息管理</li>
<li>服务名称：devops</li>
<li>部署路径：/data/bkce/devops</li>
<li>BIN 文件：/usr/local/openresty/nginx/sbin/nginx</li>
<li>配置文件： /usr/local/openresty/nginx/conf/nginx.conf</li>
<li>日志路径：/data/bkce/logs/nginx</li>
<li>Harbor API</li>
<li>组件简介：封装了部分 harbor 接口，提供给容器服务 SaaS 访问镜像资源</li>
<li>服务名称：harbor_api</li>
<li>部署路径：/data/bkce/harbor/api</li>
<li>BIN 文件：/opt/java/bin/java</li>
<li>配置文件：/data/bkce/harbor/api/conf/application.yml</li>
<li>日志路径：/data/bkce/logs/harbor/harbor_api.log</li>
</ol><h2 id="_1">容器监控</h2>
<ol>
<li>BCS Thanos Query</li>
<li>组件简介：thanos API 查询模块，提供统一的兼容 PromQL 的查询层，支持跨集群，不存储类型异构查询等</li>
<li>服务名称：bcs-thanos-query</li>
<li>部署路径：/data/bcs/monitoring/bcs-thanos</li>
<li>BIN 文件：/data/bcs/monitoring/bcs-thanos/thanos</li>
<li>配置文件：/data/bcs/monitoring/bcs-thanos/bcs-thanos-query.yml</li>
<li>日志路径：/var/log/messages</li>
<li>BCS Thanos Relay</li>
<li>组件简介：thanos 跨云代理模块, 可通过 websocket 隧道，打通不同网络的 prometheus 服务注册和代理请求</li>
<li>服务名称：bcs-thanos-relay</li>
<li>部署路径：/data/bcs/monitoring/bcs-thanos</li>
<li>BIN 文件：/data/bcs/monitoring/bcs-thanos/thanos</li>
<li>配置文件：service 参数</li>
<li>日志路径：/var/log/messages</li>
<li>BCS Thanos SD SVC</li>
<li>组件简介：thanos 服务注册中心，提供 thanos-sidecar, thanos-relay 注册自身的地址</li>
<li>服务名称：bcs-thanos-sd-svc</li>
<li>部署路径：/data/bcs/monitoring/bcs-thanos</li>
<li>BIN 文件：/data/bcs/monitoring/bcs-thanos/thanos</li>
<li>配置文件：/data/bcs/monitoring/bcs-thanos/bcs-thanos-sd-svc.yml</li>
<li>日志路径：/var/log/messages</li>
<li>BCS Thanos SD Target</li>
<li>组件简介：thanos 服务发现模块，通过请求 sd-svc，把 sidecar, relay 地址提供给 query 查询</li>
<li>服务名称：bcs-thanos-sd-target</li>
<li>部署路径：/data/bcs/monitoring/bcs-thanos</li>
<li>BIN 文件：/data/bcs/monitoring/bcs-thanos/thanos</li>
<li>配置文件：service 参数</li>
<li>日志路径：/var/log/messages</li>
<li>BCS Monitor Ruler</li>
<li>组件简介：BCS 告警策略执行模块，通过执行兼容的 prom alerting rule 规则，生成告警，推送到 alertmanager</li>
<li>服务名称：bcs-monitor-ruler</li>
<li>部署路径：/data/bcs/monitoring/bcs-monitor</li>
<li>BIN 文件：/data/bcs/monitoring/bcs-monitor/thanos</li>
<li>配置文件：/data/bcs/monitoring/bcs-monitor/bcs-monitor-prod.yml</li>
<li>日志路径：/data/bcs/logs/bcs/monitoring/ruler.log</li>
<li>BCS Monitor Alertmanager</li>
<li>组件简介：BCS 告警汇总，通知模块，对 ruler 模块推送的告警，做汇总收敛，最后按规则通知用户</li>
<li>服务名称：bcs-monitor-alertmanager</li>
<li>部署路径：/data/bcs/monitoring/bcs-monitor</li>
<li>BIN 文件：/data/bcs/monitoring/bcs-monitor/thanos</li>
<li>配置文件：/data/bcs/monitoring/bcs-monitor/bcs-monitor-prod.yml</li>
<li>日志路径：/data/bcs/logs/bcs/monitoring/alertmanager.log</li>
<li>BCS Monitor API</li>
<li>组件简介：BCS Monitor API 模块，对 SaaS 提供告警策略预览，常用告警策略列表接口等</li>
<li>服务名称：bcs-monitor-api</li>
<li>部署路径：/data/bcs/monitoring/bcs-monitor</li>
<li>BIN 文件：/data/bcs/monitoring/bcs-monitor/thanos</li>
<li>配置文件：/data/bcs/monitoring/bcs-monitor/bcs-monitor-prod.yml</li>
<li>日志路径：/data/bcs/logs/bcs/monitoring/api.log</li>
<li>BCS Grafana</li>
<li>组件简介：BCS Monitor Dashboard，开源的 grafana，内置 paas-grafana-datasource，piechart 等插件</li>
<li>服务名称：bcs-grafana</li>
<li>部署路径：/data/bcs/monitoring/bcs-grafana</li>
<li>BIN 文件：/data/bcs/monitoring/bcs-grafana/bin/grafana-server</li>
<li>配置文件：/data/bcs/monitoring/bcs-grafana/conf/bcs-grafana.ini</li>
<li>日志路径：/var/log/messages</li>
</ol><h2 id="_1">常用环境变量</h2>
<p>安装或维护过程中，可能需要获取环境的一些变量值，可以通过以下方法获取：</p>
<pre class="codehilite"><code class="language-bash">source /data/install/load_env.sh
echo [$VAR_NAME]
# Example，get bcs mysql ip addr
echo $MYSQL_BCS_IP0</code></pre>


<p>变量列表如下：</p>
<table>
<thead>
<tr>
<th>变量名</th>
<th>变量说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>HTTP_SCHEMA</td>
<td>HTTP 协议</td>
</tr>
<tr>
<td>HTTPS_SCHEMA</td>
<td>HTTPS 协议</td>
</tr>
<tr>
<td>DEFAULT_HTTP_PORT</td>
<td>默认 HTTP 监听端口</td>
</tr>
<tr>
<td>DEFAULT_HTTPS_PORT</td>
<td>默认 HTTPS 监听端口</td>
</tr>
<tr>
<td>MYSQL_BCS_IP0</td>
<td>BCS MYSQL IP 地址</td>
</tr>
<tr>
<td>MYSQL_PORT</td>
<td>BCS MYSQL 监听端口</td>
</tr>
<tr>
<td>MYSQL_BCS_USER</td>
<td>BCS MYSQL 用户名</td>
</tr>
<tr>
<td>MYSQL_BCS_PASS</td>
<td>BCS MYSQL 密码</td>
</tr>
<tr>
<td>BCS_REDIS_IP</td>
<td>BCS REDIS IP 地址</td>
</tr>
<tr>
<td>BCS_REDIS_PORT</td>
<td>BCS REDIS 监听端口</td>
</tr>
<tr>
<td>BCS_REDIS_PASS</td>
<td>BCS_REDIS 密码</td>
</tr>
<tr>
<td>BCS_REDIS_BCS_DB</td>
<td>BCS_REDIS DB 名</td>
</tr>
<tr>
<td>BCS_MONGO_IP</td>
<td>MongoDB IP 地址</td>
</tr>
<tr>
<td>BCS_MONGO_PORT</td>
<td>MongoDB 监听端口</td>
</tr>
<tr>
<td>BCS_MONGO_USER</td>
<td>MongoDB 管理员用户</td>
</tr>
<tr>
<td>BCS_MONGO_PASS</td>
<td>MongoDB 管理员密码</td>
</tr>
<tr>
<td>BCS_MONGO_ENCODE_PASS</td>
<td>加密后的 MongoDB 管理员密码</td>
</tr>
<tr>
<td>HARBOR_SERVER_FQDN</td>
<td>Harbor 仓库 URL</td>
</tr>
<tr>
<td>HARBOR_SERVER_HTTP_PORT</td>
<td>Harbor 服务 HTTP 监听端口</td>
</tr>
<tr>
<td>HARBOR_SERVER_HTTPS_PORT</td>
<td>Harbor 服务 HTTPS 监听端口</td>
</tr>
<tr>
<td>HARBOR_API_PORT</td>
<td>Harbor APi 监听端口</td>
</tr>
<tr>
<td>HARBOR_SERVER_LOG_PORT</td>
<td>Harbor 服务日志端口</td>
</tr>
<tr>
<td>HARBOR_PUBLIC_PROJECT</td>
<td>Harbor 公共镜像存放路径</td>
</tr>
<tr>
<td>HARBOR_SERVER_ADMIN_USER</td>
<td>Harbor 管理员用户名</td>
</tr>
<tr>
<td>HARBOR_SERVER_ADMIN_PASS</td>
<td>Harbor 管理员密码</td>
</tr>
<tr>
<td>DEVOPS_NAVIGATOR_FQDN</td>
<td>BCS SaaS 访问域名</td>
</tr>
<tr>
<td>DEVOPS_NAVIGATOR_HTTP_PORT</td>
<td>BCS SaaS 访问 HTTP 端口</td>
</tr>
<tr>
<td>DEVOPS_NAVIGATOR_HTTPS_PORT</td>
<td>BCS SaaS 访问 HTTPS 端口</td>
</tr>
<tr>
<td>DEVOPS_NAVIGATOR_API_HTTP_PORT</td>
<td>BCS 导航页 HTTP API 端口</td>
</tr>
<tr>
<td>DEVOPS_NAVIGATOR_API_HTTPS_PORT</td>
<td>BCS 导航页 HTTPS API 端口</td>
</tr>
<tr>
<td>DEVOPS_NAVIGATOR_PM_PORT</td>
<td>BCS 导航页项目端口</td>
</tr>
<tr>
<td>MYSQL_DEVOPS_PORT</td>
<td>BCS 导航页使用的 mysql 端口</td>
</tr>
<tr>
<td>THANOS_QUERY_HOST</td>
<td>BCS 监控 QUERY 服务访问地址</td>
</tr>
<tr>
<td>THANOS_QUERY_HTTP_PORT</td>
<td>BCS 监控 QUERY 服务 HTTP 端口</td>
</tr>
<tr>
<td>THANOS_QUERY_GRPC_PORT</td>
<td>BCS 监控 QUERY 服务 GRPC 端口</td>
</tr>
<tr>
<td>THANOS_QUERY_CLUSTER_PORT</td>
<td>BCS 监控 QUERY 服务 CLUSTER 端口</td>
</tr>
<tr>
<td>THANOS_RULER_HOST</td>
<td>BCS 监控 RULER 服务访问地址</td>
</tr>
<tr>
<td>THANOS_RULE_HTTP_PORT</td>
<td>BCS 监控 RULE 服务 HTTP 端口</td>
</tr>
<tr>
<td>THANOS_RULE_GRPC_PORT</td>
<td>BCS 监控 RULE 服务 GRPC 端口</td>
</tr>
<tr>
<td>IAM_VERSION</td>
<td>BCS 使用权限中心版本号</td>
</tr>
<tr>
<td>BCS_GRAFANA_HOST</td>
<td>BCS 监控 GRAFANA 组件部署地址</td>
</tr>
<tr>
<td>BCS_GRAFANA_HTTP_PORT</td>
<td>BCS 监控 GRAFANA 组件监听端口</td>
</tr>
<tr>
<td>BCS_WEB_CONSOLE_IP</td>
<td>BCS Web Conosle 服务访问地址</td>
</tr>
<tr>
<td>BCS_WEB_CONSOLE_PORT</td>
<td>BCS Web Conosle 服务监听端口</td>
</tr>
<tr>
<td>BCS_OPS_HOST</td>
<td>BCS OPS 服务访问地址</td>
</tr>
<tr>
<td>BCS_OPS_PORT</td>
<td>BCS OPS 服务监听端口</td>
</tr>
<tr>
<td>BCS_API_IP</td>
<td>BCS API 服务 HTTP 监听端口</td>
</tr>
<tr>
<td>BCS_API_HTTP_PORT</td>
<td>BCS API 服务 HTTPS 监听端口</td>
</tr>
<tr>
<td>BCS_API_INSECURE_PORT</td>
<td>BCS API 服务不安全监听端口</td>
</tr>
<tr>
<td>BCS_STORAGE_PORT</td>
<td>BCS Strorage 服务监听端口</td>
</tr>
<tr>
<td>BCS_DNS_SERVICE_PORT</td>
<td>BCS Service DNS 服务监听端口</td>
</tr>
<tr>
<td>BCS_CC_IP</td>
<td>BCS CC 服务访问地址</td>
</tr>
<tr>
<td>BCS_CC_PORT</td>
<td>BCS CC 服务监听端口</td>
</tr>
<tr>
<td>K8S_VERSION</td>
<td>K8S 版本号</td>
</tr>
<tr>
<td>K8S_WATCH_VERSION</td>
<td>BCS Data Watch 组件版本号</td>
</tr>
<tr>
<td>K8S_AGENT_VERSION</td>
<td>BCS Agent 组件版本号</td>
</tr>
</tbody>
</table><h3 id="_1">卸载详细步骤</h3>
<ol>
<li>
<p>注意事项</p>
</li>
<li>
<p>为了保证数据安全，卸载任务不会对 MYSQL、Redis、MongoDB 数据库进行操作，如要清理，请自行清理，对应服务名称分别为：mysql@bcs、redis@bcs、mongod</p>
</li>
<li>卸载任务不会对 K8S 集群进行操作，在卸载容器管理平台前请先在容器管理平台的 SaaS 里删除节点与集群</li>
<li>
<p>卸载任务不会删除文件，操作的步骤只有停止并关闭 service，把/data/bkce 和/data/bcs 重命名为以当时操作时间为后缀的目录</p>
</li>
<li>
<p>打开标准运维---&gt;公共流程---&gt;[BlueKing][BCS][Basic] Environment Uninstall---&gt;新建任务
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/unstall_create_task.png" /></p>
</li>
<li>
<p>选择 容器管理平台后台服务器所在业务
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/uninstall_select_biz.png" /></p>
</li>
<li>
<p>节点选择，不用修改，直接进入下一步
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/unstall_step_next.png" /></p>
</li>
<li>
<p>参数填写</p>
</li>
</ol>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/uninstall_args_input.png" />
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/uninstall_args_step_next.png" /></p>
<table><tbody>
<tr><td width="10%">安装包与安装脚本存放路径</td><td width="90%">社区版安装包（src 目录）、安装脚本存放路径（install 目录）和安装后文件存放路径（bkce），默认为/data，建议选择一个大一点的数据分区挂载路径</td></tr>
<tr><td width="10%">BCS 后台服务 IP 地址</td><td width="90%">容器管理平台后台服务部署的 IP 地址，容器管理平台后台服务包括 bcs-api、bcs-dns-service、bcs-storage、bcs-cc，同时还会部署容器管理平台后台服务所依赖的 etcd 与 zookeeper 服务，体验环境使用 1 台服务器即可，生产环境建议使用 3 台服务器做高可用，多个 IP 使用半角逗号分隔，不要使用偶数台（2 或者 4）服务器，否则安装 zookeeper 服务会失败</td></tr>
<tr><td width="10%">BCS 导航页组件 IP 地址</td><td width="90%">部署项目信息管理服务 IP 地址，负责项目创建及基本信息管理，生产环境建议用 2 台服务器做高可用，多个 IP 使用半角逗号分隔，此 IP 需要在客户端浏览器可访问</td></tr>
<tr><td width="10%">Web Console IP 地址</td><td width="90%">部署在提供 kubectl 命令行工具 IP 地址，可以使用 web 页面快捷查看集群内资源，生产环境建议用 2 台服务器做高可用，多个 IP 使用半角逗号分隔</td></tr>
<tr><td width="10%">BCS 监控 IP 地址</td><td width="90%">部署容器监控服务的 IP 地址，目前只支持单个 IP</td></tr>
<tr><td width="10%">Harbor 私有仓库 IP 地址</td><td width="90%">部署私有镜像仓库的 IP 地址，使用 Harbor 提供私有仓库服务，如果需要存放的镜像较多，需要部署在磁盘空间稍大的服务器上，目前只支持部署 1 台服务器；此 IP 需要在客户端浏览器可访问，访问 Harbor 页面管理方式为http://{外网 IP}，管理员用户名默认为：admin，密码为：Harbor12345</td></tr>
</tbody></table>

<ol>
<li>执行部署作业，执行作业过程中没有出现错误即部署正常，否则需要根据 job 执行错误信息解决问题
  <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/unstall_exec_job.png" /></li>
</ol><h2 id="faq">FAQ</h2>
<ol>
<li><strong>容器管理平台服务异常了如何排查问题？</strong></li>
</ol>
<p>容器管理平台服务基本都是使用 systemd 托管的，各个服务的功能与服务名称可以在本文档 <strong>第四部分</strong> 查询，首先使用命令：
   <code>bash
   systemctl status [service_name]</code>
   查看服务的状态是否异常，如果服务器异常使用命令：
   <code>bash
   systemctl restart [service_name]
   systemctl status [service_name]</code>
   重启服务看看是否可以恢复，否则就需要根据 <strong>第四部分</strong> 中提供的日志路径来查看具体错误日志来解决，如果还是解决不了请在社区寻求帮忙。</p>
<ol>
<li><strong>导入标准运维模版时流程 ID 冲突了如何处理？</strong></li>
</ol>
<p>如果导入标准运维模版有冲突代表你目前公共流程中已经存在流程模版中的流程 ID 了，这时我们可以选择点击 流程 ID 自增提交。等部署完成容器管理平台后，找到部署了 bcs-ops 的服务器（部署容器管理平台时填写的“bcs 后台服务 IP 地址”参数 IP，如果有多台，多台都需要修改），bcs-ops 服务的配置文件/data/bkce/etc/bcs/ops-operator.conf，原本映射关系如下：
   <code>ini
   template_k8s_install_id = 1 （[BlueKing][BCS][K8S] Create Master）
   template_k8s_uninstall_id = 2 （[BlueKing][BCS][K8S] Remove Master）
   template_k8s_add_id = 3 （[BlueKing][BCS][K8S] Add Node）
   template_k8s_remove_id = 4 （[BlueKing][BCS][K8S] Delete Node）</code>
   假如流程 ID 自增提交后的流程 ID 与模版名称如下：
   <code>bash
   10001  [BlueKing][BCS][K8S] Create Master
   10002  [BlueKing][BCS][K8S] Remove Master
   10003  [BlueKing][BCS][K8S] Add Node
   10004  [BlueKing][BCS][K8S] Delete Node</code>
   那配置文件就修改为：
   <code>ini
   template_k8s_install_id = 10001
   template_k8s_uninstall_id = 10002
   template_k8s_add_id = 10003
   template_k8s_remove_id = 10004</code>
   最后需要重启 bcs-ops，使配置生效：
   <code>bash
   systemctl restart bcs-ops
   systemctl status bcs-ops</code></p>
<ol>
<li><strong>需要替换原有 BCS 域名，如何处理？</strong></li>
</ol>
<p>替换容器管理平台域名方法如下：</p>
<p>1.登录部署容器管理平台时填入的参数 “BCS 导航页组件 IP 地址”，如果填入了多台，多台都需替换</p>
<p>```bash
   # {OLD_DOMAIN}为老的PaaS域名，{NEW_DOMAIN}为新的PaaS域名
   env_js_file='/data/bkce/devops/navigator/frontend/console/static/env.js'
   sed -i 's#{OLD_DOMAIN}#{NEW_DOMAIN}#g' ${env_js_file}
   cat ${env_js_file}</p>
<p># 更新lua脚本，替换域名后缀，{OLD_DOMAIN_SUFFIX}为老域名后缀，{NEW_DOMAIN_SUFFIX}为新域名后缀
   init_lua_file='/data/bkce/devops/navigator/gateway/conf/lua/init.lua'
   sed -i 's#{OLD_DOMAIN_SUFFIX}#{NEW_DOMAIN_SUFFIX}#g' ${init_lua_file}
   cat ${init_lua_file}</p>
<p># 替换BCS与BCS-API域名，{OLD_BCS_DOMAIN}为老BCS域名，{NEW_BCS_DOMAIN}为新BCS域名，{OLD_BCS_API_DOMAIN}为老BCS_API域名，{NEW_BCS_API_DOMAIN}为新BCS_API域名
   bcs_domain_file='/data/bkce/devops/navigator/gateway/conf/frontend.conf'
   sed -i 's#{OLD_BCS_DOMAIN}#{NEW_BCS_DOMAIN}#g' ${bcs_domain_file}
   cat ${bcs_domain_file}</p>
<p>bcs_api_domain_file='/data/bkce/devops/navigator/gateway/conf/backend.conf'
   sed -i 's#{OLD_BCS_API_DOMAIN}#{NEW_BCS_API_DOMAIN}#g' ${bcs_api_domain_file}
   cat ${bcs_api_domain_file}</p>
<p># 重启devops服务
   systemctl restart devops
   systemctl status devops
   ```</p>
<p>2.登录部署容器管理平台时填入的参数 “BCS Web Console IP 地址”，选其中任何一台服务器</p>
<p>修改/data/install/bin/04-final/bcs.env 文件中的环境变量 DEVOPS_NAVIGATOR_FQDN 值为新的 BCS 域名，并执行以下命令：
   <code>bash
   source /data/install/load_env.sh
   cd /data/bkce/bcs/web_console &amp;&amp; sh on_migrate /data</code></p>
<p>3.登录部署容器管理平台时填入的参数 “BCS 监控 IP 地址”，如果填入了多台，多台都需替换
   ```bash
   # 替换BCS域名，{OLD_BCS_DOMAIN}为老BCS域名，{NEW_BCS_DOMAIN}为新BCS域名
   bcs_monitor_file='/data/bcs/monitoring/bcs-monitor/bcs-monitor-prod.yml'
   sed -i 's#{OLD_BCS_DOMAIN}#{NEW_BCS_DOMAIN}#g' ${bcs_monitor_file}
   cat ${bcs_monitor_file}</p>
<p># 重启bcs monitor服务
   systemctl restart bcs-monitor-api bcs-monitor-ruler bcs-monitor-alertmanager
   systemctl status bcs-monitor-api bcs-monitor-ruler bcs-monitor-alertmanager
   ```</p>
<p>4.在蓝鲸开发者中心调整环境变量与重新部署 SaaS 应用</p>
<p>在 S-mart 应用菜单中找到 bk_bcs_app 应用，并点击进入
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/bcs_smart_app.png" /></p>
<p>修改环境变量 BKAPP_DEVOPS_HOST 为新的 BCS 域名
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/bkapp_devops.png" /></p>
<p>重新部署 bk_bcs_app 应用
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/deploy_bcs_app.png" /></p>
<p>在 S-mart 应用菜单中找到 bk_bcs_monitor 应用，并点击进入
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/monitor_smart_app.png" /></p>
<p>修改环境变量 BKAPP_DEVOPS_HOST 为新的 BCS 域名
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/monitor_bkapp_devops.png" /></p>
<p>重新部署 bk_bcs_monitor 应用
   <img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/deploy_bcs_monitor.png" /></p>
<p>5.修改域名解析或在 hosts 文件中修改映射为新的域名</p>
<ol>
<li><strong>添加 Helm Chart 仓库失败，如何处理？</strong></li>
</ol>
<p>按照指引添加 Helm Chart 仓库时会失败，是因为 Harbor 仓库为了保证安全性切换了 HTTPS 协议</p>
<p><img alt="avatar" src="F:\v_awjliu\BKDocs\ZH/6.0/部署指南/产品白皮书/assets/helm_add_chart.png" /></p>
<p><code>bash
   helm repo add lasttest http://harbor-api.service.consul/chartrepo/testdata01/ --username=xxxxxxx --password=xxxxxxx
   Error: looks like "http://harbor-api.service.consul/chartrepo/testdata01/" is not a valid chart repository or cannot be reached: Get "https://harbor-api.service.consul/chartrepo/testdata01/index.yaml": x509: certificate relies on legacy Common Name field, use SANs or temporarily enable Common Name matching with GODEBUG=x509ignoreCN=0
   或
   Error: looks like "http://harbor-api.service.consul/chartrepo/testdata01/" is not a valid chart repository or cannot be reached: Get "https://harbor-api.service.consul/chartrepo/testdata01/index.yaml": x509: certificate signed by unknown authority</code>
   可以按以下操作修复该问题：</p>
<p>1、把部署 BCS 后台服务器上的/data/bkce/cert/bcs/harbor-api.service.consul.crt 拷贝到 helm client 所在服务器</p>
<p>2、export GODEBUG 环境变量，修改访问 harbor 协议为 https 协议，然后追加证书参数即可</p>
<p><code>bash
   export GODEBUG=x509ignoreCN=0;helm repo add lasttest https://harbor-api.service.consul/chartrepo/testdata01/ --username=xxxx --password=xxx --ca-file=./harbor-api.service.consul.crt
   "testdata01" has been added to your repositories</code></p>
<p>3、同样，helmpush 时也要加 ca 证书</p>
<p><code>bash
   helmpush rumpetroll/ testdata01 --ca-file=./harbor-api.service.consul.crt
   Pushing rumpetroll-1.0.1.tgz to testdata01...
   Done.</code>
 5. <strong>容器监控问题排查思路</strong></p>
<pre class="codehilite"><code> 1、查看 Prometheus pod 状态是否正常

 ```bash
 kubectl get pod -n thanos
 ```
 2、查看 Prometheus pod 日志是否有报错

 ```bash
 kubectl logs --tail=100 prometheus-po-prometheus-operator-prometheus-0 -n thanos -c prometheus
 kubectl logs --tail=100 prometheus-po-prometheus-operator-prometheus-0 -n thanos -c thanos-sidecar
 ```
 3、查看 Prometheus 部署 pod 到 thanos.service.consul:18902 网络是否连通

 ```bash
 kubectl exec -it prometheus-po-prometheus-operator-prometheus-0 -n thanos -c thanos-sidecar -- telnet thanos.service.consul 18902
 ```
 4、在监控部署服务器上看服务是否正常

 ```bash
 systemctl status bcs-thanos-query bcs-thanos-relay bcs-thanos-sd-svc bcs-thanos-sd-target bcs-monitor-ruler bcs-grafana.service bcs-monitor-alertmanager bcs-monitor-api
 ```

 先做完这些检查再做下一步判断</code></pre><h1 id="_1">术语解释</h1>
<h2 id="_2">名称约定</h2>
<p>蓝盾(持续集成平台)，简称为 <code>bk-ci</code>。</p>
<p>部署脚本中以 <code>ci</code> 作为标识， env 文件中所有变量以 <code>BK_CI_</code> 开头。
蓝盾注册在 ESB 中的 <code>app_code</code> 为 <code>bk_ci</code>。
install.config 中 ，使用 <code>ci(工程名)</code> 表示蓝盾的组件。
systemd 服务名： <code>bk-ci-工程名.service</code>， 都位于 <code>bk-ci.target</code> 下。</p>
<h2 id="_3">蓝盾组件介绍</h2>
<p>如下为蓝盾的组件，也称为“工程”（<code>proj</code>， <code>project</code>）。</p>
<p>工程名是蓝鲸环境中各种名称的基础。
如 <code>install.config</code> 中使用 <code>ci(工程名)</code> 来指代蓝盾的某个工程。
如 安装完成后， systemd 的服务名： <code>bk-ci-工程名</code>。
以及服务内部域名： <code>工程名-标签.service.consul</code> 。标签的定义见 env 文件里的 <code>BK_CI_CONSUL_DISCOVERY_TAG</code>，默认为 <code>devops</code>。</p>
<table>
<thead>
<tr>
<th>工程</th>
<th>描述 　</th>
</tr>
</thead>
<tbody>
<tr>
<td>agentless</td>
<td>无编译环境。同 dockerhost ，资源配额更低。一般用于和蓝鲸及第三方系统联动。</td>
</tr>
<tr>
<td>artifactory</td>
<td>二进制构件仓库管理。对接各类构件服务后端。目前可使用本地存储。</td>
</tr>
<tr>
<td>auth</td>
<td>蓝盾权限服务。对接各种其他的权限管理服务，如蓝鲸 IAM。</td>
</tr>
<tr>
<td>dispatch</td>
<td>构建机调度服务。调度流水线任务。管理私有构建机。</td>
</tr>
<tr>
<td>dispatch-docker</td>
<td>构建机调度服务。调度流水线任务。管理公共构建机。</td>
</tr>
<tr>
<td>dockerhost</td>
<td>公共构建机。与本机 dockerd 通信，管理容器的生命周期。</td>
</tr>
<tr>
<td>environment</td>
<td>管理私有构建机。</td>
</tr>
<tr>
<td>gateway</td>
<td>网关。负责提供对外的入口。前端页面放在 frontend ，会一起安装。</td>
</tr>
<tr>
<td>image</td>
<td>Docker 镜像代理。负责对接 Docker registry 拉取镜像。</td>
</tr>
<tr>
<td>log</td>
<td>日志服务。存储流水线执行的输出。</td>
</tr>
<tr>
<td>misc</td>
<td>一些管理工具。目前仅 cron 。</td>
</tr>
<tr>
<td>notify</td>
<td>通知服务。目前对接了蓝鲸通知。</td>
</tr>
<tr>
<td>openapi</td>
<td>管理对外暴露的 api 接口。用途类似 apigw 。请求 → gateway → openapi → 其他微服务</td>
</tr>
<tr>
<td>plugin</td>
<td>蓝盾功能扩展。</td>
</tr>
<tr>
<td>process</td>
<td>流水线服务。包含编排引擎，模板管理，流水线管理等。</td>
</tr>
<tr>
<td>project</td>
<td>项目管理服务。</td>
</tr>
<tr>
<td>quality</td>
<td>质量红线。为流水线提供准入准出管理。</td>
</tr>
<tr>
<td>repository</td>
<td>代码库管理。对接 SVN 、 GitLab 、 GitHub 等。</td>
</tr>
<tr>
<td>store</td>
<td>研发商店，提供插件、模板、扩展、镜像等的分享及管理。</td>
</tr>
<tr>
<td>ticket</td>
<td>凭证管理。集中管理各类密钥证书等。</td>
</tr>
<tr>
<td>websocket</td>
<td>用于实时推送状态到前端页面。</td>
</tr>
</tbody>
</table>
<h2 id="_4">安装包结构</h2>
<p>蓝盾的安装包是 tar.gz 形式。</p>
<p>顶层目录名为 “ bkci ”。其下即以工程命名的对应的目录。
除此之外，我们还有一些仅用于内部依赖使用或者安装 / 维护用途的目录：
| 文件 / 目录 | 描述 |
| -------------- | ------------------------------------------------------------ |
| agent-package/ | 存放 agent 及相关脚本。 environment 、 dispatch 、 dockerhost 、 agentless 依赖此目录。 |
| frontend/ | 前端代码。安装 gateway 时会同时安装此目录。 |
| scripts/ | 安装或使用时会用到的脚本。待提供安装脚本。 |
| support-files/ | 安装时所需的文件。 |
| VERSION | 蓝盾版本描述文件。 |</p>
<p>其结构大概如下所示：</p>
<pre class="codehilite"><code class="language-bash"># tar tf ./bkci-v1.2.*.tar.gz | grep &quot;^[^/]*/([^/]*/){1,2}$&quot; -E | sort
bkci/agent-package/
bkci/agent-package/config/
bkci/agent-package/jar/
bkci/agent-package/jre/
bkci/agent-package/packages/
bkci/agent-package/script/
bkci/agent-package/upgrade/
bkci/agentless/
bkci/artifactory/
bkci/auth/
bkci/dispatch/
bkci/dockerhost/
bkci/environment/
bkci/frontend/
bkci/frontend/artifactory/
bkci/frontend/codelib/
bkci/frontend/common-lib/
bkci/frontend/console/
bkci/frontend/environment/
bkci/frontend/pipeline/
bkci/frontend/quality/
bkci/frontend/store/
bkci/frontend/svg-sprites/
bkci/frontend/ticket/
bkci/gateway/
bkci/gateway/core/
bkci/image/
bkci/log/
bkci/misc/
bkci/monitoring/
bkci/notify/
bkci/openapi/
bkci/plugin/
bkci/process/
bkci/project/
bkci/quality/
bkci/repository/
bkci/scripts/
bkci/sign/
bkci/store/
bkci/support-files/
bkci/support-files/bkiam/
bkci/support-files/file/
bkci/support-files/iam/
bkci/support-files/sql/
bkci/support-files/templates/
bkci/ticket/
bkci/websocket/</code></pre><h1 id="_1">日常维护</h1>
<h2 id="_2">服务管理</h2>
<h3 id="_3">启动服务</h3>
<p>安装脚本根据 <code>install.config</code> 配置了开机自启。如果 <code>install.config</code> 变动，请手动禁用并删除旧服务，并重新执行安装操作。</p>
<p>我们在每个机器上提供了 systemd 的 <code>bk-ci.target</code> unit ，使用此 unit 可以控制蓝盾所有的 <code>.service</code>。</p>
<pre class="codehilite"><code class="language-bash">systemctl start 服务名</code></pre>


<blockquote>
<p><strong>提示</strong></p>
<p>在 systemctl 命令时，如果无特指， <code>服务名</code> 一般指蓝盾的服务，以 <code>bk-ci-工程名</code> 命名。</p>
</blockquote>
<p>大部分场景下，蓝盾的服务会分布到多个节点。所以使用 <code>pcmd</code> 在多个节点批量执行这些命令。</p>
<p>示例：
在中控机启动所有机器上的全部蓝盾服务：</p>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
pcmd -m ci 'systemctl start bk-ci.target'</code></pre>


<p>在中控机仅启动所有的 <code>ci(gateway)</code> 服务，其 system 服务名为 <code>bk-ci-gateway</code>，而 <code>pcmd -m</code>参数则是需要 <code>ci_gateway</code> 的形式。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_gateway 'systemctl start bk-ci-gateway'</code></pre>


<p>如果登录到了对应的节点，则是：
启动全部蓝盾服务：</p>
<pre class="codehilite"><code class="language-bash">systemctl start bk-ci.target</code></pre>


<p>启动特定的蓝盾服务：如网关</p>
<pre class="codehilite"><code class="language-bash">systemctl start bk-ci-gateway</code></pre>


<blockquote>
<p><strong>注意</strong></p>
<p>同节点上可能还有其他蓝盾服务，所以避免使用 <code>bk-ci.target</code> 。
同理，不使用 <code>-m ci</code> 来启动特定的服务，以防误启动禁用节点的蓝盾服务。
因为当服务被禁用时，也能手动启动。</p>
</blockquote>
<h3 id="_4">停止服务</h3>
<p>在中控机停止所有机器上的全部蓝盾服务：</p>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
pcmd -m ci 'systemctl stop bk-ci.target'</code></pre>


<p>在中控机停止所有机器上的 <code>ci(gateway)</code> 服务，其 system 服务名为 <code>bk-ci-gateway</code>，而 <code>pcmd -m</code>参数则是需要 <code>ci_gateway</code> 的形式。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_gateway 'systemctl start bk-ci-gateway'</code></pre>


<p>如果登录到了对应的节点： 则是：
停止全部蓝盾服务：</p>
<pre class="codehilite"><code class="language-bash">systemctl start bk-ci.target</code></pre>


<p>停止特定的蓝盾服务：如网关</p>
<pre class="codehilite"><code class="language-bash">systemctl start bk-ci-gateway</code></pre>


<h3 id="_5">重载服务</h3>
<p>gateway 使用的是 nginx ，支持 reload。</p>
<p>在中控机 reload 所有的 <code>ci(gateway)</code> 服务，其 system 服务名为 <code>bk-ci-gateway</code>，而 <code>pcmd -m</code>参数则是需要 <code>ci_gateway</code> 的形式。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_gateway 'systemctl reload bk-ci-gateway'</code></pre>


<p>如果登录到了蓝盾网关节点： 则是：</p>
<pre class="codehilite"><code class="language-bash">systemctl start bk-ci-gateway</code></pre>


<p>微服务不支持 reload 。</p>
<h3 id="_6">重启服务</h3>
<p>在中控机重启所有机器上的全部蓝盾服务：</p>
<pre class="codehilite"><code class="language-bash">cd ${CTRL_DIR:-/data/install}
pcmd -m ci 'systemctl restart bk-ci.target'</code></pre>


<p>在中控机重启所有的 <code>ci(gateway)</code> 服务，其 system 服务名为 <code>bk-ci-gateway</code>，而 <code>pcmd -m</code>参数则是需要 <code>ci_gateway</code> 的形式。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_gateway 'systemctl restart bk-ci-gateway'</code></pre>


<p>如果登录到了对应的节点： 则是：
重启全部蓝盾服务：</p>
<pre class="codehilite"><code class="language-bash">systemctl restart bk-ci.target</code></pre>


<p>重启特定的蓝盾服务：如网关</p>
<pre class="codehilite"><code class="language-bash">systemctl restart bk-ci-gateway</code></pre>


<h2 id="_7">检查状态</h2>
<h3 id="_8">查看单个服务状态</h3>
<p>在中控机查看所有的 <code>ci(gateway)</code> 服务，其 system 服务名为 <code>bk-ci-gateway</code>，而 <code>pcmd -m</code>参数则是需要 <code>ci_gateway</code> 的形式。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_gateway 'systemctl status bk-ci-gateway'</code></pre>


<p>如果登录到了对应的节点：
查看特定的蓝盾服务：如网关</p>
<pre class="codehilite"><code class="language-bash">systemctl status bk-ci-gateway</code></pre>


<h3 id="_9">批量查看服务状态</h3>
<p>我们提供了 <code>./bin/bks.sh</code> 脚本，可以概览展示所有蓝鲸服务的状态。
此脚本仅检查启动的 systemd 服务，且默认仅展示蓝鲸相关的服务，你可以使用正则作为参数匹配服务名。
如果服务被禁用，则不会展示。 install 时会自动 enable 服务。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci '${CTRL_DIR:-/data/install}/bin/bks.sh'</code></pre>


<p>使用关键字搜索 systemd 的服务名， 如查看蓝盾及 Consul 服务：</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci '${CTRL_DIR:-/data/install}/bin/bks.sh bk-ci consul'</code></pre>


<h3 id="stdout-stderr">检查服务的 stdout 和 stderr</h3>
<p>服务使用 systemd 启动，启动过程中会输出提示信息。
需登录到对应的机器上操作。</p>
<pre class="codehilite"><code class="language-bash">journalctl -xeu 服务名</code></pre>


<h3 id="_10">检查微服务域名</h3>
<p>蓝盾的微服务在启动后，会自动注册 Consul 。域名格式如下： <code>微服务名-标签.service.consul</code>。标签即 env 文件里的 <code>BK_CI_CONSUL_DISCOVERY_TAG</code>，默认 <code>devops</code>。</p>
<p>例如：查询 dispatch 的 DNS 解析结果：</p>
<pre class="codehilite"><code class="language-bash">getent hosts dispatch-devops.service.consul  # 会输出DNS解析结果, 格式为: IP  域名. 如果无输出, 则说明无解析, 需要检查对应服务是否正常.</code></pre>


<blockquote>
<p><strong>提示</strong></p>
<p><code>getent</code> 命令来自 <code>glic-common</code> 包，一般无需安装。</p>
</blockquote>
<h3 id="springboot-health">SpringBoot Health 接口</h3>
<p>java 微服务提供了 health 接口，可以输出服务状态。</p>
<pre class="codehilite"><code class="language-bash">API_PORT=  # 填写对应微服务的API PORT。可以查看 /data/bkce/ci/微服务/start.env 文件获取。
curl -m 1 -sf &quot;http://127.0.0.1:$API_PORT/management/health&quot;</code></pre>


<h2 id="_11">检查日志</h2>
<blockquote>
<p>日志目录默认位于 <code>/data/bkce/logs/ci/</code>，其下以组件命名。 gateway 的日志名为 nginx 。</p>
</blockquote>
<h3 id="_12">网关日志</h3>
<p>错误日志（ error.log ）：我们可以使用 pcmd 检查 <code>ci(gateway)</code> 节点上的 <code>/data/bkce/logs/ci/nginx/devops.error.log</code></p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_gateway 'tail ${BK_HOME:-/data/bkce}/logs/ci/nginx/devops.error.log'</code></pre>


<p>至于访问日志（ access.log ），命名则是 <code>devops-access.YYYY-mm-dd.log</code> 格式。例如查看当天的 access.log 结尾：</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_gateway 'tail ${BK_HOME:-/data/bkce}/logs/ci/nginx/devops.access.$(date +%Y-%m-%d).log'</code></pre>


<h3 id="_13">微服务日志</h3>
<p>默认： <code>/data/bkce/logs/ci/服务名/服务名-devops.log</code>。
参考查看 project 的日志：</p>
<pre class="codehilite"><code class="language-bash">ms=project  # 在此修改微服务的名称。
pcmd -m ci_$ms &quot;tail ${BK_HOME:-/data/bkce}/logs/ci/$ms/$ms-${BK_CI_CONSUL_DISCOVERY_TAG:-devops}.log&quot;</code></pre>


<p>或者搜索 <code>Exception</code> 及 <code>Caused by</code>等关键词：</p>
<pre class="codehilite"><code class="language-bash">ms=project  # 在此修改微服务的名称。
pcmd -m ci_$ms &quot;grep --color=yes -E '^Caused by|[.][a-zA-Z]*Exception' ${BK_HOME:-/data/bkce}/logs/ci/$ms/$ms-${BK_CI_CONSUL_DISCOVERY_TAG:-devops}.log&quot;</code></pre>


<h3 id="_14">构建容器日志</h3>
<p>公共构建机（dockerhost）在每个容器启动后开始记录日志。
路径为 <code>$BK_HOME/logs/ci/docker/BUILD_ID/RETRY/docker.log</code>。
<code>BUILD_ID</code>是流水线 URL 里 <code>b-</code> 开头的整段内容（包含 <code>b-</code>），每次 “执行” 流水线则生成一个新的 ID 。
<code>RETRY</code>则是重试次数，第一次运行即为 1 ，在流水线出错时，可以点击插件或 job 右侧的重试链接，此时 <code>RETRY</code>计数增加。
假设 <code>BUILD_ID</code>为 <code>b-ca389ac9a9b3426687f0b7f63dc02532</code>，初次运行，则其路径如下 （仅在调度到的构建机上存在。）：</p>
<pre class="codehilite"><code class="language-bash">/data/bkce/logs/ci/docker/b-ca389ac9a9b3426687f0b7f63dc02532/1/docker.log</code></pre>


<h2 id="_15">依赖服务升级</h2>
<p>蓝盾依赖着 MySQL、RabbitMQ、Redis、consul 等第三方软件。</p>
<p>修订版及小版本下的安全更新建议持续进行。理论上无稳定性风险。但建议做好预案。
不建议升级大版本。如果必须大版本升级依赖的服务，请关注蓝鲸官方公告。并自行测试可用性。</p>
<h2 id="_16">数据迁移</h2>
<p>迁移数据库及蓝盾的数据目录（变量<code>BK_CI_DATA_DIR</code>）。
以及用户自定义 env 文件: <code>${CTRL_DIR:-/data/install}/bin/03-userdef/ci.env</code> (如果新环境密码发生变动, 记得更新此文件. )</p>
<h2 id="_17">拉取镜像</h2>
<p>提前在构建机拉取镜像，避免在构建时临时拉取镜像导致任务超时。</p>
<p>注意：构建机需要能访问 Docker hub 。用户亦可自行修改 <code>/etc/docker/daemon.json</code> 指定私有 registry 。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_dockerhost 'docker pull bkci/ci'</code></pre><h1 id="_1">升级指引</h1>
<p>本页面为蓝鲸社区版环境下的部署方案变动信息。代码变动及其他部署方式的变动请查阅 <a href="https://github.com/Tencent/bk-ci/releases">GitHub Release</a> 。</p>
<p>如需迁移微服务到其他主机，请查阅 <a href="Maintenance.md">维护文档</a> 的 “数据迁移” 章节。</p>
<h2 id="ci">流水线（CI）升级指引</h2>
<h3 id="v12x-v15x">v1.2.x -&gt; v1.5.x</h3>
<p>支持直接从灰度体验的 <code>v1.2.x</code> 版本升级。
引入了新的关键微服务 <code>dispatch-docker</code>，必须更新 install.config 文件，请以快速部署文档描述为准。</p>
<h3 id="v12x-v13x">v1.2.x -&gt; v1.3.x</h3>
<p>支持直接从灰度体验的 <code>v1.2.x</code> 版本升级。
引入了新的关键微服务 <code>dispatch-docker</code>，必须更新 install.config 文件，请以快速部署文档描述为准。</p>
<h2 id="ci_1">流水线（CI）部署流程变更记录</h2>
<p>部分对接蓝鲸社区版的操作会放在部署流程中更新，部署脚本随代码发布更新。</p>
<h3 id="20210706">20210706</h3>
<p>已在蓝鲸社区版 6.0.3 测试通过。测试部署的 CI 版本： v1.5.3, v1.5.7。</p>
<p><a href="https://bkopen-1252002024.file.myqcloud.com/bkci/bk-ci-deploy-20210706.dat">下载地址</a>
1. 强制安装 Tencent KonaJDK。规避部分用户自定义 JDK 导致的程序异常。<a href="https://github.com/Tencent/bk-ci/issues/4591">#4591</a>
2. 安装 fontconfig，规避 v1.5.7 版本以下创建项目提示“接口异常”。<a href="https://github.com/Tencent/bk-ci/issues/4591">#4591</a></p>
<h3 id="20210618">20210618</h3>
<p>已在蓝鲸社区版 6.0.2 测试通过。测试部署的 CI 版本： v1.5.3。</p>
<p><a href="https://bkopen-1252002024.file.myqcloud.com/bkci/bk-ci-deploy-20210618.dat">下载地址</a>
1. 提前检查 java 是否存在，安装 KonaJDK。
2. 流程全局变量提示文字更新。</p>
<h3 id="20210611">20210611</h3>
<p>已在蓝鲸社区版 6.0.2 测试通过。测试部署的 CI 版本： v1.5.3。</p>
<p><a href="https://bkopen-1252002024.file.myqcloud.com/bkci/bk-ci-deploy-20210611.dat">下载地址</a></p>
<p>初版。</p><h1 id="_1">性能调优</h1>
<h2 id="_2">服务端性能</h2>
<h3 id="_3">调整内存限额</h3>
<p>在安装时限制每个微服务的内存为 <code>256mb~512mb</code>。如果您的机器装备了更大的内存，可以调整限额。</p>
<p>方法：
1. 进入微服务的安装目录。此处以 <code>dispatch-docker</code> 服务为例：
   <code>bash
   cd $BK_HOME/ci/dispatch-docker/</code>
2. 修改微服务目录下的 <code>start.env</code> 文件，添加或更新 <code>MEM_OPTS</code> 配置项。模板文件为 <code>service.env</code>文件，随 CI 版本更新而更新，请勿修改。 例如
    <code>bash
    # grep MEM_OPTS service.env
    MEM_OPTS="-Xms256m -Xmx512m"
    # grep MEM_OPTS start.env
    MEM_OPTS="-Xms384m -Xmx768m"</code>
3. 重启微服务。
   <code>bash
   systemctl restart bk-ci-dispatch-docker</code>
4. 使用 <code>ps</code> 命令检查内存限额是否生效：
   <code>bash
   # ps aux | grep dispatch-docker
   blueking  7238  309  1.6 6801664 530212 ?      Sl   12:45   0:34 java -server -Dfatjar=/dispatch-docker/boot-dispatch-docker.jar -Ddevops_gateway=bk-ci.service.consul -Dserver.port=21938 -Dbksvc=bk-ci-dispatch-docker -Xms384m -Xmx768m com.tencent.devops.dispatch.docker.DispatchDockerApplicationKt</code></p>
<h2 id="_4">构建机启动</h2>
<p>目前构建机（公共构建机及无编译环境）启动时默认连接到 Docker Hub 拉取构建镜像。</p>
<h3 id="registry-mirror">registry mirror</h3>
<p>Docker Hub 官方自 2020 年 11 月起对镜像拉取频率进行了限制（<a href="https://www.docker.com/increase-rate-limits">官方公告点此</a>）。
如果遇到了 <code>ERROR: toomanyrequests: Too Many Requests.</code> 报错，请自备 Docker Hub 账户。</p>
<p>推荐在内网部署 Docker Hub 镜像站缓存。请参考官方文档：<a href="https://docs.docker.com/registry/recipes/mirror/">https://docs.docker.com/registry/recipes/mirror/</a></p>
<h3 id="docker-registry">私有 docker registry</h3>
<p>推荐使用 Harbor 建设私有 docker registry: <a href="https://github.com/goharbor/harbor">https://github.com/goharbor/harbor</a></p>
<p>并转存蓝盾官方构建镜像到私有 Registry。以便提升加载速度。</p>
<h2 id="_5">构建提速</h2>
<h3 id="_6">内网代码库</h3>
<p>从公网拉取代码的速度较慢，请建设内网代码库。</p>
<p>进阶方案为部署 Git Cache Proxy Server，请自行研究。</p>
<h3 id="_7">内网软件源镜像</h3>
<p>在内网提供软件源可以大幅缩减构建时的公网带宽开销及下载时间。</p>
<p>推荐使用清华大学开源的镜像同步系统: <a href="https://github.com/tuna/tunasync">https://github.com/tuna/tunasync</a></p><h1 id="_1">私有构建机方案</h1>
<h2 id="_2">概述</h2>
<p>私有构建机，也称为 “第三方构建机” ，是对和特定项目绑定的 Agent 的泛称。一般用于敏感项目、资源隔离、定制硬件或构建环境等场景。</p>
<p>我们默认提供了基于 Docker 技术的公共构建机，公共构建机默认向所有项目开放，使用统一的容器规格。</p>
<p>我们已经在标准运维流程模板“<code>[蓝鲸持续集成][CI]部署或升级流水线</code>”中提供了私有构建机的部署流程，仅默认部署了 Linux 系统的支撑环境。</p>
<p>如需在 Windows 及 MacOS 系统下安装私有构建机，需要您手动实施部分步骤。</p>
<h2 id="_3">服务端（私有构建机支撑环境）</h2>
<h3 id="_4">补充软件包</h3>
<h4 id="jrezip">jre.zip</h4>
<p>中控机 <code>/data/src/bkci-agent-package-patch/jre</code> 下需要放置 Linux / Windows / MacOS 对应的 jre.zip 文件。
一般使用 JDK8 的 tgz 安装包为基础， jre.zip 中应当存在 <code>bin/java</code> ，并预打包 <code>lib/ext/bcprov-jdk16-1.46.jar</code> 到 jre.zip 里。</p>
<p>参考制作命令：</p>
<pre class="codehilite"><code class="language-bash">jdk_macos=&quot;/data/src/jdk-macos.tar.gz&quot;  # 请自行修改路径
jdk_windows=&quot;/data/src/jdk-windos.zip&quot;  # 请自行修改路径
mkdir -p /data/src/bkci-agent-package-patch/jre/macos /data/src/bkci-agent-package-patch/jre/windows
/data/src/ci/scripts/bk-ci-gen-jrezip.sh macos &quot;$jdk_macos&quot; /data/src/bkci-agent-package-patch/jre/macos/jre.zip
/data/src/ci/scripts/bk-ci-gen-jrezip.sh windows &quot;$jdk_windows&quot; /data/src/bkci-agent-package-patch/jre/windows/jre.zip</code></pre>


<p>各 jre.zip 里的 <code>bcprov.jar</code> 放置路径：</p>
<pre class="codehilite"><code class="language-text">jre/linux/jre.zip
  1876535  05-23-2018 20:18   lib/ext/bcprov-jdk16-1.46.jar
jre/macos/jre.zip
  1876535  05-23-2018 20:24   Contents/Home/lib/ext/bcprov-jdk16-1.46.jar
jre/windows/jre.zip
  1876535  05-23-2018 20:20   lib/ext/bcprov-jdk16-1.46.jar</code></pre>


<h4 id="unzipexe">unzip.exe</h4>
<p>windows 需要 <code>unzip.exe</code> ，放在中控机 <code>/data/src/bkci-agent-package-patch/packages/windows/</code> 目录下。</p>
<p>推荐使用 GnuWin 项目编译的 Info-ZIP： <a href="http://gnuwin32.sourceforge.net/packages/unzip.htm">http://gnuwin32.sourceforge.net/packages/unzip.htm</a></p>
<h3 id="_5">部署</h3>
<p>在完成了软件包补充工作后，进入“标准运维”，重新使用模板“<code>[蓝鲸持续集成][CI]部署或升级流水线</code>”创建任务即可。</p>
<h3 id="_6">检查部署情况</h3>
<p>请安装客户端测试。</p>
<h2 id="_7">客户端（私有构建机实例）</h2>
<h3 id="_8">选型要求</h3>
<ol>
<li>第三方构建机需要能直接（不通过代理）访问 <code>$BK_CI_PUBLIC_URL</code> 。如果不能满足，请自行处理网络互通问题。</li>
<li>需要准备至少 2GB 空闲内存，以及 10GB 以上的磁盘空间。</li>
</ol>
<h2 id="_9">安装私有构建机</h2>
<p>在创建或编辑流水线界面。选择添加新的“ Job 类型”，一般选择“ Linux ”。在“构建资源类型”下拉框里选择“新增第三方构建机”。
请选择构建机的系统，遵循页面提示安装 agent ，并导入构建机。</p>
<p>一些关于 agent 的信息：
1. 每个 agent 实例是和项目绑定的，无法跨项目分享。但同一个主机上能安装多个 agent 。
2. agent 会把当前执行安装命令的位置作为工作目录。所有的构建时产物及日志都存放于此，请确保空间足够。
3. 不同的 agent 实例请勿共享安装目录，这样会导致问题。
4. 当安装了多个 agent 实例（尤其是跨项目时），请做好运行用户及权限的控制与隔离。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>agent 安装目录选择建议：
1. agent 安装目录需要有足够的磁盘空间。
2. agent 实例是项目专属的，建议 agent 目录命名和所属项目具备相关性。在多 agent 共存时便于维护及排查。</p>
</blockquote>
<p>安装过程中会自动启动进程，最终目录如下：</p>
<pre class="codehilite"><code class="language-text">[devops@VM-5-42-centos p-demo]$ ls -Ap
.agent.properties  devopsDaemon  jre.zip    runtime/  uninstall.sh
agent.zip          install.sh    logs/      start.sh  worker-agent.jar
devopsAgent        jre/          README.md  stop.sh   workspace/</code></pre>


<h2 id="_10">使用私有构建机</h2>
<p>如“安装私有构建机”章节的提示，找到“构建资源类型”，选择类型为 “私有：单构建机”。
如果有通过环境管理设置构建环境，则选择类型为“私有：构建集群”。</p>
<h2 id="_11">私有构建机管理</h2>
<p>蓝盾顶部导航 → 环境管理</p>
<p>在左侧的“环境”选项卡里，可以对多个构建机进行编组。</p>
<h2 id="_12">私有构建机维护</h2>
<h3 id="agent">检查 agent 状态</h3>
<p>确认构建机上 agent 进程（ <code>devopsDaemon</code> ， <code>devopsAgent</code> ）已存在，页面查看 agent 状态处于正常状态。</p>
<pre class="codehilite"><code class="language-bash">ps -ef | grep  devops</code></pre>


<p>windows 构建机请检查任务管理器。</p>
<h3 id="_13">卸载及重装</h3>
<p>Linux / MacOS：
1. 进入 agent 安装目录。 agent 安装目录可以在 <strong>环境管理</strong>→<strong>节点</strong>→ 点击<strong>别名</strong>链接进入<strong>构建机详情</strong>页面 → 下方<strong>基本信息</strong>→<strong>安装路径</strong> 查到。<code>agent GO_20190612</code> 之前版本因为没有采集 agent 安装目录信息，需要通过在构建机上查看进程来追溯安装目录，命令为 <code>ps -ef | grep devops</code>
2. 执行 <code>./uninstall.sh</code> 卸载 agent ，同时<strong>删除 agent.zip 文件</strong>。卸载后确认 agent 进程已退出，如果没有退出可以手动强制杀掉进程。至此<strong>卸载</strong>完成，如需重装，请继续操作。
3. 从上面步骤 1 的构建机详情页右上角<strong>复制安装命令</strong>，在 agent 安装目录执行安装命令。重装时无需在蓝盾“环境管理”中重新导入。
4. 检查 agent 状态。</p>
<p>Windows ：
参考操作和 Linux 类似。不过使用 任务管理器 确定进程信息。</p>
<h2 id="_14">私有构建机问题排查</h2>
<h3 id="_15">私有构建机安装失败</h3>
<ol>
<li>请检查部署时有无提供对应平台的 jre.zip 。</li>
<li>请检查 jre.zip 内是否有 <code>bcprov-jdk16-1.46.jar</code> 。</li>
<li>请检查 Linux / MacOS 系统中是否有 <code>unzip</code> 命令。（ Windows 版本包含在 agent 里了）</li>
<li>如果已经完成了上述步骤，请清空安装目录后重新安装。避免旧的错误安装包缓存造成干扰。</li>
</ol>
<h3 id="agent-agent">直接复制 agent 目录启动的 agent 不识别或任务调度异常</h3>
<p>同一主机可以在不同的目录安装多个 agent 实例，不同的 agent 实例依靠 agent 安装目录下 <code>.agent.properties</code> 文件里的 <code>devops.agent.id</code> 区分。</p>
<p>如果 ID 相同，会被视作同一 agent 实例，因此产生心跳异常及调度问题。请卸载其中一个 Agent，并参考“安装私有构建机”章节重新操作。</p><h1 id="faq">FAQ</h1>
<h2 id="ci">流水线（CI）部署问题</h2>
<h3 id="ip-ip-xxx">异常信息：IP 校验失败，请确认输入的 IP xxx 是否合法</h3>
<p>参考 “安装 gse agent” 章节安装 agent，并确保 IP 所在业务和流程模板一致。</p>
<h3 id="can-not-find-agent-by-ip">异常信息：任务执行失败，详情页提示 can not find agent by ip</h3>
<p>参考 “安装 gse agent” 章节安装 agent，“节点管理”对应 IP 的“agent 状态”应为“正常”。</p>
<h3 id="curl">"下载及解压安装包"失败：curl 报错</h3>
<p>此步骤会联网下载 CI 安装包，如无法正常下载，请参考上文“离线环境部署”章节放置安装包。</p>
<h3 id="linux-jrezip-datasrcjava8tgz">制作 linux 版 jrezip 步骤报错 /data/src/java8.tgz 不存在</h3>
<p>一般为用户自行删除了中控机上的 <code>/data/src/java8.tgz</code> ， 请重新下载蓝鲸社区版安装包并解压，或者从 job 及 ci 等主机上获取。</p>
<h2 id="ci_1">流水线（CI）访问及使用问题</h2>
<h3 id="web">web 界面一直提示服务部署中</h3>
<p>首先请耐心等待一段时间，在 systemd 服务状态转为 <code>active</code> 时，表示 <code>java</code> 进程启动成功，此时蓝盾的微服务逻辑可能还没启动完成，未曾注册服务发现的域名。</p>
<p>如果已经等待了 10 分钟，可能出现了故障，请参考此步骤检查：
1. 检查蓝盾集群中的 Consul 是否正在运行： <code>pcmd -m ci 'FORCE_TTY=1 ${CTRL_DIR:-/data/install}/bin/bks.sh consul'</code>。并使用 <code>consul members</code>确认成功加入了 consul 集群。
2. 检查网关及微服务是否正常运行：<code>pcmd -m ci 'FORCE_TTY=1 ${CTRL_DIR:-/data/install}/bin/bks.sh bk-ci'</code>，参考《<a href="../../增强包维护/蓝盾/Maintenance.md">日常维护</a>》的“检查日志——网关日志”章节检查是否出现报错（ERROR 或者 Exception）。
3. 根据 《<a href="../../增强包维护/蓝盾/Maintenance.md">日常维护</a>》的“检查状态——检查微服务域名” 章节确认微服务域名是否注册，当对应的微服务没有注册时，请参考《<a href="../../增强包维护/蓝盾/Maintenance.md">日常维护</a>》的“检查日志——微服务日志”章节检查是否出现异常。</p>
<h3 id="_1">找不到公共构建机</h3>
<p>执行流水线后，job 无法初始化，提示 <code>Start build Docker VM failed, no available Docker VM. Please wait a moment and try again.</code>。</p>
<p>这是因为找不到可用的公共构建机所致。请参考如下步骤排查：
1. 新增的公共构建机需要手动注册，请参考 “注册构建机” 章节。
2. 在 <code>ci(dispatch-docker)</code> 主机使用 <code>/data/src/ci/scripts/bkci-op.sh list</code> 命令检查当前构建机是否均为 <code>enabled=yes</code> 的状态。否则请检查对应 dockerhost 节点的服务是否存活，并核查服务日志。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>如果确定不需要公共构建机，或者急需使用，可以考虑添加私有构建机到本项目使用。细节请参考《<a href="../../增强包维护/蓝盾/Private-build-setup.md">私有构建机方案</a>》。</p>
</blockquote>
<h3 id="artifactory-404">artifactory 下载构件时偶现 404</h3>
<p>表现为下载的二进制构件文件不变的情况，经常出现 404，但是重试时能正常下载。
请检查是否部署了多个 artifactory 实例，gateway 会将请求均衡到不同的实例上。
故 artifactory 多实例时，应该提前配置 NFS 等共享文件系统到 <code>$BK_CI_DATA_DIR</code>。
如果已经存在多实例，造成了数据分裂，需人工合并 artifactory 服务的数据目录（ <code>$BK_CI_DATA_DIR/artifactory/</code>）。</p>
<h2 id="ci_2">流水线（CI）维护问题</h2>
<h3 id="ci-gateway-80">ci-gateway 使用非 80 端口问题</h3>
<p>目前暂未测试使用非 80 端口的效果，可以自行变更 env 文件中的端口变量体验，但不对效果做保证。</p>
<p>如果发现端口不一致的 bug，欢迎在 GitHub 反馈：<a href="https://github.com/Tencent/bk-ci/issues/4611">chore: ci-gateway 监听非 80 端口 #4611</a></p>
<h3 id="https">HTTPS 适配</h3>
<blockquote>
<p><strong>提示</strong></p>
<p>我们在 v1.5.8 临时提供了 <code>${BK_PKG_SRC_PATH:-/data/src}/ci/scripts/bk-ci-utils-https.sh</code> 快速设置 https。</p>
<p>在中控机执行此脚本即可。如果升级了 CI 版本，需要重新执行此脚本。</p>
<p>欢迎体验上述切换脚本并在 GitHub 反馈: <a href="https://github.com/Tencent/bk-ci/issues/4612">chore: ci-gateway 部署时支持 https #4612</a></p>
</blockquote>
<p>蓝盾的 HTTPS 适配目前没有全部通过测试，故暂无默认部署支持，需要使用上述补丁脚本。</p>
<p>参考手动修改步骤：
1. 修改 gateway <code>server.devops.conf</code>里注释掉的 SSL 相关配置项。
2. 复制蓝鲸的<code>bk.ssl</code>到上述配置里 <code>devops.ssl</code> 对应的路径。
3. 修改 PUBLIC_URL 为 HTTPS:// 前缀。
4. 重新使用 HTTPS URL 注册蓝鲸 PaaS APP 。</p>
<blockquote>
<p><strong>提示</strong></p>
<p>HTTPS 适配还面临着更多证书信任相关的适配工作，且未曾经过完备的 HTTPS 兼容性测试及评审，故暂不做官方推荐，不提供自动部署 HTTPS 。</p>
</blockquote>
<h3 id="gitlab-https">GitLab HTTPS 适配问题</h3>
<p>当 GitLab 启用 HTTPS 且 HTTP 默认 30x 跳转到 HTTPS 时，无法自动注册 WebHook 的问题。此问题排期中： <a href="https://github.com/Tencent/bk-ci/issues/2894">https://github.com/Tencent/bk-ci/issues/2894</a></p>
<p>目前有 2 种临时解决方案，按需选择。</p>
<p><strong>选择 1 ：修复自动注册问题</strong>
注意：此操作会导致后续添加的其他 GitLab 服务端均使用对应的 HTTPS 入口访问。
参考步骤：
1. 配置 <code>BK_CI_REPOSITORY_GITLAB_URL</code> 为 HTTPS 开头的地址。
2. 重新安装 <code>ci(repository)</code> ，并重启服务。</p>
<pre class="codehilite"><code class="language-bash">pcmd -m ci_repository 'cd ${CTRL_DIR:-/data/install}; export LAN_IP; ./bin/install_ci.sh -e ./bin/04-final/ci.env -p &quot;$BK_HOME&quot; -m repository 2&gt;&amp;1;'
pcmd -m ci_repository 'systemctl restart bk-ci-repository'</code></pre>


<ol>
<li>编辑流水线，确保使用 WebHook 触发，重新保存，因为仅在流水线保存时才触发 WebHook 注册。</li>
<li>检查 GitLab 对应项目下是否出现了自动注册 WebHook 地址。</li>
</ol>
<p><strong>选择 2 ：手动添加 WebHook</strong>
如果不想修改蓝盾的配置，可以前往 GitLab 对应的仓库下配置手动触发。（需要管理员权限，路径参考为 settings--integrations ）。
填写的 WebHook URL 请查阅配置文件 <code>${BK_HOME:-/data/bkce}/etc/ci/application-repository.yml</code> 的 <code>scm.externel.gitlab.gitlabHookUrl</code> 配置项：</p>
<pre class="codehilite"><code class="language-yaml">scm:
  external:
    gitlab:
      gitlabHookUrl: 默认为$BK_CI_PUBLIC_URL/ms/process/api/external/scm/gitlab/commit</code></pre>


<p>“trigger” 一般选择 push 即可。也可选择 tag ，请测试后决定。
“ssl verify” 按需禁用。</p>
<h3 id="_2">流水线镜像问题</h3>
<p>流水线调用 Docker 进行镜像的拉取，请确保 dockerhost 节点可以访问私有的 Docker registry 服务，或 Docker 官方 registry 。</p>
    </body>
    </html>
    